A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨青 中级黑马   /  2013-6-5 01:21  /  1131 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JAVA动态代理,为什么说它是动态的?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

1 个回复

正序浏览
本帖最后由 刘海芳 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马