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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王林涛 中级黑马   /  2013-8-7 08:51  /  1455 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王林涛 于 2013-9-23 21:20 编辑

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

评分

参与人数 1黑马币 +1 收起 理由
杨兴庭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
就现在学习的代理,我觉得它就是解决AOP(面向方面的编程),也就是在InvocationHandle接口下的invoke()中添加了一些系统方法(日志、安全、事务)。
回复 使用道具 举报
哪颗最亮的星星 发表于 2013-8-7 10:52
就现在学习的代理,我觉得它就是解决AOP(面向方面的编程),也就是在InvocationHandle接口下的invoke()中添 ...

亲,你说的那是代理,而不是动态代理
回复 使用道具 举报

//抽象角色: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接口的类)这三者可以改变。



评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
你先学习,后面我学到,请你指教一下!!
回复 使用道具 举报
你先学习,后面我学到,请你指教一下!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马