`

动态代理设计模式 Java

    博客分类:
  • java
阅读更多

 

应用场景:不改变被代理对象的代码,新建动态代理类,并在代理类中增加相应的处理代码。

 

在目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。
其实现主要通过是java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//动态代理设计模式: InvocationHandler
//doBefore(): 在代理调用被代理方法前执行
//doAfter():  在代理类调用被代理方法后执行
public class Dyn {
 /** 获取代理对象 */
 public static IHelloWorld getHelloWoldProxy() {
  IHelloWorld hello = new HelloWorld();
  InvocationHandler handler = new DynHandler(hello);
  ClassLoader cl = hello.getClass().getClassLoader();
  
  IHelloWorld helloProxy = (IHelloWorld)Proxy.newProxyInstance(cl, new Class[]{IHelloWorld.class},  handler);
  return helloProxy;
 }
 public static void main(String[] args) {
  
  IHelloWorld proxy = getHelloWoldProxy();
  //调用hi()之前,调用doBefore(),hi()运行之后,调用doAfter()
  String c = proxy.hi("dog");
  System.out.println(c);
 }

}

class DynHandler implements InvocationHandler{
 //被代理者
 private Class cls = null;
 //被代理的实例
 private IHelloWorld obj = null;
 //我要代理谁
 public DynHandler(IHelloWorld obj){
  this.obj = obj;
 }
 //调用被代理的方法
 /**
  * args: proxy.hi传进来的参数
  */
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  System.out.println("invoke() ..");
  doBefore(args);
  Object result = method.invoke(this.obj, args);
  doAfter(args);
  return result; //返回代理对象
 }
 
 public void doBefore(Object[] args){
  System.out.println("doBefore() .." + (String)args[0]);
 }
 
 public void doAfter(Object[] args){
  System.out.println("doAfter() ..");
 }
 
}

//被代理类
 class HelloWorld implements IHelloWorld{
 
 public String hi(String name) {
  System.out.println("hi() ..");
  return "hello " + name;
 }
}
 
//Exception in thread "main" java.lang.IllegalArgumentException: cn.util.HelloWorld is not an interface
 
interface IHelloWorld{
 public String hi(String name);
}

//2.代理模式
public class DynamicPattern {
 private Hello h;
 
 public DynamicPattern(Hello h){
  this.h=h;
 }
 
 public String sayHi(String name){
  String str = h.hi(name);
  System.out.println("sayHi() ..");
  return str;
 }
 
 public static void main(String args[]){
  DynamicPattern d = new DynamicPattern(new Hello());
  String s = d.sayHi("jake");
  System.out.println(s);
 }
}

class Hello{
 
 public String hi(String name) {
  System.out.println("hi() ..");
  return "hello " + name;
 }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics