黑马程序员技术交流社区

标题: 动态代理类的原理 [打印本页]

作者: code2014    时间: 2014-5-20 22:40
标题: 动态代理类的原理
动态代理类的原理是什么

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


作者: honey536    时间: 2014-5-21 08:33
看看怎么回事,现在正在学习基础
作者: yuon11937    时间: 2014-5-21 08:47
本帖最后由 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对象可以当做目标类的对象来使用,它里面的方法有目标类的方法,实现目标类的功能就可以只接通过代理对象调用这些方法,就可以实现,同时也实现了系统功能(计算方法时间)。你要对反射很明白就可以很好理解了。
作者: 不似侽紸角.    时间: 2014-5-27 19:57
yuon11937 发表于 2014-5-21 08:47
你先要明白代理的作用是什么,当要给某些类的方法增加一些额外的功能时,我们可以通过创建另外一个代理类, ...

说的不错呦
作者: 静水流华    时间: 2014-10-1 11:37
听了张老师的关于代理的客,脑袋空空没有感觉
作者: 乔栋    时间: 2015-7-4 17:03
看看。。。。。。。。。。。。。。。。。。。




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