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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© twtzhongxin 中级黑马   /  2014-3-13 22:55  /  1196 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

怎样理解动态代理中动态的意思,另外,有静态的代理吗?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

6 个回复

倒序浏览
代理分两种,静态和动态的。静态代理的意思就是给每一个需要代理的接口都去写一个代理,如果系统中几千个都需要呢,那要写的代理太多了。这时就需要动态代理了,动态的意思就是在程序运行期间,可以动态的传入目标对象,用来动态调用的。你随便传入一个对象,都可以进行代理的。看代码:
  1.         /**
  2.          *
  3.          * @param target 需要代理的目标对象
  4.          * @param advice 执行目标对象方法前后可以执行的其他代码对象
  5.          * @return
  6.          */
  7.         public Object getProxy(Object target, Advice advice) {
  8.                 return Proxy.newProxyInstance(target.getClass().getClassLoader(),
  9.                                 target.getClass().getInterfaces(),
  10.                                 new InvocationHandler() {                                       
  11.                                         @Override
  12.                                         public Object invoke(Object proxy, Method method, Object[] args)
  13.                                                         throws Throwable {
  14.                                                 advice.beforeMethod();
  15.                                                 Object retVal = method.invoke(target, args);
  16.                                                 advice.afterMethod();
  17.                                                 return retVal;
  18.                                         }
  19.                                 });
  20.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
(4). 代理技术的分类
按照是否是在程序运行期间产生代理类可以将代理分为静态代理和动态代理
[1]. 静态代理:就是手动为每一个目标类的每一个方法都增加交叉业务,也就是手动为每一个目标类增加代理类
【缺点】如果目标类数量非常多或者目标类中的功能非常多,直接使用静态代理的方式来为目标类增加交叉业务会非常的繁琐。
[2]. 动态代理:通过特定的设置,在程序运行期间指示JVM动态地生成类的字节码。这种动态生成的类往往被用作代理类,即动态代理类。
【也就是运行时做编译的事情并且把生成的字节码加载成这个类的Class对象】

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作   。

动态代理的定义:一个动态代理类在运行期implements一组interface,使得interface实现类的方法调用被分派至其他的类(另外的interface实现类或者任意的类)的方法。讲得更通俗一些,要了解动态代理,我们就要知道什么东西动态了,代理了什么?首先,一个Proxy代理了一组interface的方法。注意,代理的是interface,而不是Class,也不是abstract Class;其次,Proxy具有的型别由绑定的interface所决定的,动态就体现在此。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
静态代理类优缺点
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。
缺点:
1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
回复 使用道具 举报
午夜b'Boy 来自手机 中级黑马 2014-3-14 21:34:47
地板
动态代理类通过读取配置文件信息 ,动态生成符合特定接口的类字节码,且在建立代理对象时,通过

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
传入ilvokcation对象,添加自己的代码,对委托类进行增强
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马