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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© code2014 中级黑马   /  2014-5-20 22:40  /  4035 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

动态代理类的原理是什么

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
李小然 + 1
honey536 + 2 赞一个!

查看全部评分

6 个回复

倒序浏览
代理类是为了面向方面的编程而产生的,要为 存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、这就代理
动态代理是jvm自动生成的,方便用户生成代理类,
API中有一个类Proxy,这个提供了方法传递 你要代理目标的相同接口即可。当你要为目标增加的数据时,
用Proxy的相同方法就可以,他会把方法传递给目标。Proxy中的InvocationHandler 可以为你增加目标和要代理的数据。 有点乱。。。。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
看看怎么回事,现在正在学习基础
回复 使用道具 举报
本帖最后由 yuon11937 于 2014-5-21 08:54 编辑

你先要明白代理的作用是什么,当要给某些类的方法增加一些额外的功能时,我们可以通过创建另外一个代理类,在代理类中实现和另一个类的相同的这个方法,然后在代理类中增加额外的系统功能,当需要使用到系统功能时,调用该代理类的方法,也可以达到调用原来方法的目的,不需要系统功能时调用原来的类的方法。但是这样一来我们就要自己手动创建每个代理类,其实这也就是静态代理。Java中的Proxy类可以动态创建代理类,为已经存在的具有相同接口的目标类的每个方法增加一些额外的系统功能,核心之处其实就是反射,Proxy的getProxyClass()方法动态创建代理类,运行时JVM自动的生成代理类的.class字节码文件。这就不需要我们自己去编写代理类了。
  1. public class ProxyTest {

  2.         public static void main(String[] args) throws Exception {
  3.         
  4.                 Collection proxy3 = (Collection)Proxy.newProxyInstance(Collection.class.getClassLoader(),
  5.                                 new Class[] {Collection.class},
  6.                                 new InvocationHandler() {
  7.                                         //创建目标类示例对象
  8.                                         ArrayList target = new ArrayList();
  9.                                         //重写invoke()方法,每次调用代理类时,都计算目标方法的运行时间
  10.                                         @Override
  11.                                         public Object invoke(Object proxy, Method method,
  12.                                                         Object[] args) throws Throwable {
  13.                                                 long begin = System.currentTimeMillis();
  14.                                                 Object retValue = method.invoke(target, args);
  15.                                                 long end = System.currentTimeMillis();
  16.                                                 System.out.println("++++" + (end - begin));
  17.                                                 return retValue;
  18.                                         }
  19.                                        
  20.                                 });
  21.                
  22.                 proxy3.add("abc");
  23.                 System.out.println(proxy3);//打印目标集合
  24.                 System.out.println(proxy3.getClass().getName());//com.sun.proxy.$Proxy0
  25. }
复制代码

目标类是ArrayList,Proxy3对象可以当做目标类的对象来使用,它里面的方法有目标类的方法,实现目标类的功能就可以只接通过代理对象调用这些方法,就可以实现,同时也实现了系统功能(计算方法时间)。你要对反射很明白就可以很好理解了。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
yuon11937 发表于 2014-5-21 08:47
你先要明白代理的作用是什么,当要给某些类的方法增加一些额外的功能时,我们可以通过创建另外一个代理类, ...

说的不错呦
回复 使用道具 举报
听了张老师的关于代理的客,脑袋空空没有感觉
回复 使用道具 举报
看看。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马