黑马程序员技术交流社区

标题: 急---动态代理问题! [打印本页]

作者: 王林涛    时间: 2013-8-7 08:51
标题: 急---动态代理问题!
本帖最后由 王林涛 于 2013-9-23 21:20 编辑

动态代理有哪些应用?
如果要给举例子,请说明该例子是用来做什么的!
在下拜谢了!

作者: 哪颗最亮的星星    时间: 2013-8-7 10:52
就现在学习的代理,我觉得它就是解决AOP(面向方面的编程),也就是在InvocationHandle接口下的invoke()中添加了一些系统方法(日志、安全、事务)。
作者: 王林涛    时间: 2013-8-7 11:24
哪颗最亮的星星 发表于 2013-8-7 10:52
就现在学习的代理,我觉得它就是解决AOP(面向方面的编程),也就是在InvocationHandle接口下的invoke()中添 ...

亲,你说的那是代理,而不是动态代理
作者: 黑马龙子    时间: 2013-8-7 11:24
标题: //抽象角色:java动态代理的实现目前只支持接口,不支持...
本帖最后由 黑马龙子 于 2013-8-7 11:29 编辑

   所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。    生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!打电话的就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!附加例子:希望对你有所帮助!

  1. //抽象角色:java动态代理的实现目前只支持接口,不支持抽象类
  2. interface BusinessFoo
  3. {
  4.      void foo();
  5. }
  6. interface BusinessBar
  7. {
  8.     String bar(String message);
  9. }
  10. //真实角色:真正实现业务逻辑方法
  11. class BusinessFooImpl implements BusinessFoo
  12. {
  13.     public void foo()
  14.     {
  15.         System.out.println("BusinessFooImpl.foo()");
  16.     }
  17. }
  18. class BusinessBarImpl implements BusinessBar
  19. {
  20.     public String bar(String message)
  21.     {
  22.         System.out.println("BusinessBarImpl.bar()");
  23.         return message;
  24.     }
  25. }
  26. //动态角色:动态生成代理类
  27. class BusinessImplProxy implements InvocationHandler
  28. {
  29.     private Object obj;
  30.     BusinessImplProxy() {
  31.     }
  32.     BusinessImplProxy(Object obj) {
  33.         this.obj = obj;
  34.     }
  35.     public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
  36.     {
  37.         Object result = null;
  38.         doBefore();
  39.         result = method.invoke(obj,args);
  40.         doAfter();
  41.         return result;
  42.     }
  43.     public void doBefore(){
  44.         System.out.println("do something before Business Logic");
  45.     }
  46.     public void doAfter(){
  47.         System.out.println("do something after Business Logic");
  48.     }
  49.     public static Object factory(Object obj)
  50.     {
  51.         Class cls = obj.getClass();
  52.         return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));
  53.     }
  54. }
  55. //测试类
  56. public class DynamicProxy
  57. {   
  58.     public static void main(String[] args) throws Throwable
  59.     {
  60.         BusinessFooImpl bfoo = new BusinessFooImpl();
  61.         BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);
  62.         bf.foo();
  63.         System.out.println();
  64.         
  65.         BusinessBarImpl bbar = new BusinessBarImpl();
  66.         BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);
  67.         String message = bb.bar("Hello,World");
  68.         System.out.println(message);
  69.     }
  70. }
复制代码

程序流程说明:       new BusinessFooImpl();创建一个“真实角色”,传递给工厂方法BusinessImplProxy.factory(),进而初始化“调用处理器”——即实现InvocationHandler的类。并返回一个动态创建的代理类实例,由于“代理角色”也必然实现了“抽象角色”提供的业务逻辑方法,故可向下转型为BusinessBar,并赋值给指向BusinessBar类型的引用bb。       newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法由自己来指定参数动态返回需要的代理类,而invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用的。当执行“bb.bar("Hello,World");”方法时,JVM动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke(obj,args)真正执行!BusinessImplProxy.Factory静态方法用来动态生成代理类(“代理角色”),在运行时根据不同的业务逻辑接口BusinessFoo和BusinessBar,在运行时分别动态生成了代理角色。“抽象角色”、“代理角色”以及调用处理器(实现InvocationHandler接口的类)这三者可以改变。




作者: Household    时间: 2013-9-20 22:19
你先学习,后面我学到,请你指教一下!!
作者: Household    时间: 2013-9-20 22:20
你先学习,后面我学到,请你指教一下!!




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