黑马程序员技术交流社区

标题: JAVA动态代理 [打印本页]

作者: 杨青    时间: 2013-6-5 01:21
标题: JAVA动态代理
JAVA动态代理,为什么说它是动态的?

作者: 刘海芳    时间: 2013-6-5 09:46
本帖最后由 刘海芳 于 2013-6-5 09:47 编辑

额,因为实现了InvocationHandler的那个动态代理生成类可以你通过参数的不同,动态的生成不同的代理对象,而不是静态代理那样,要为每个代理类都写一个中间的代理对象,就程序的灵活上看像就是动态的,因为,无论你要生成任何的代理对象都用那个了,附静态代理和动态代理的代码区别...
静态代理:
  1. package ttitfly.proxy;      
  2.      
  3. public interface HelloWorld {      
  4.     public void print();            
  5. }
  6. package ttitfly.proxy;      
  7.      
  8. public class HelloWorldImpl implements HelloWorld{      
  9.      
  10.     public void print(){      
  11.         System.out.println("HelloWorld");      
  12.     }         
  13. }
  14. public class StaticProxy implements HelloWorld{      
  15.      
  16.     public HelloWorld helloWorld ;      
  17.     public StaticProxy(HelloWorld helloWorld){      
  18.         this.helloWorld = helloWorld;      
  19.     }      
  20.          
  21.     public void print(){      
  22.         System.out.println("Welcome");      
  23.         //相当于回调      
  24.         helloWorld.print();      
  25.     }           
  26. }  
复制代码
动态代理
  1. package ttitfly.proxy;         
  2.          
  3. import java.lang.reflect.InvocationHandler;         
  4. import java.lang.reflect.Method;         
  5. import java.lang.reflect.Proxy;         
  6. //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类         
  7. public class DynamicProxy implements InvocationHandler{         
  8.               
  9.     private Object object;           
  10.     //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。      
  11.     //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法      
  12.     public Object bindRelation(Object object){           
  13.         this.object = object;         
  14.         return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);           
  15.     }           
  16.     //拦截关联的这个实现类的方法被调用时将被执行         
  17.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {           
  18.         System.out.println("Welcome");         
  19.         Object result = method.invoke(object, args);           
  20.         return result;         
  21.     }         

  22. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2