zoukankan      html  css  js  c++  java
  • [学习原创] java.lang.reflect.Proxy使用 规格严格

    最近没事,看了一下Spring的书籍,从它最开始的AOP1到AOP2,于是对基本的实现原理有了一种探究的想法,AOP1用的Dynamic Proxy的模式是从1.3引入,其本质就是生成代理类,包装原有的对象,将原有对象的方法指派给包装后生成的代理类,在方法调用前后,甚至于方法调用上做手脚,这个手脚就要具体看是什么业务逻辑。

     

    Proxy的代码很简单,核心就是newProxyInstance,接收参数为类加载器,接口,包装的InvokecationHandler,代码如下:

     1         /*
     2          * Look up or generate the designated proxy class.
     3          */
     4         Class<?> cl = getProxyClass(loader, interfaces);
     5 
     6         /*
     7          * Invoke its constructor with the designated invocation handler.
     8          */
     9         try {
    10             Constructor cons = cl.getConstructor(constructorParams);
    11             return cons.newInstance(new Object[] { h });
    12         } catch (NoSuchMethodException e) {
    13             throw new InternalError(e.toString());
    14         } catch (IllegalAccessException e) {
    15             throw new InternalError(e.toString());
    16         } catch (InstantiationException e) {
    17             throw new InternalError(e.toString());
    18         } catch (InvocationTargetException e) {
    19             throw new InternalError(e.toString());
    20         }

    代码很简单,1、要获取代理类;2、根据代理类的构造方法反射生成对象。

    Sun在内部是调用了ProxyGenerator这个类来处理的,因为它有一个属性能够将生成的class字节码打印到本地文件系统:

    System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

    在代码中将这个属性开关打开就可以存储class文件,然后用类似的反编译工具可以看出详细的生成内容,我建议这么做,因为Proxy的API文档说的很玄乎,如果不对照生成的class文件来看的,真的很难透彻的理解其本质含义。

    Proxy的模式相对来说,效率还是很低的,虽然缓存了方法对象,但是性能上肯定要比普通调用少不少。

    后续:

    1、把ProxyGenerator分析后,再来补充这篇文档

    2、对比CGLIB,以及其他AOP的工具来分析

    虽然网上有很多类似文章,但是我觉得只有自己深入的透彻的分析才能实实在在的学习到知识。

    后记:

    1、关于ProxyGenerator, google时候发现openjdk网上有这个源码:http://cr.openjdk.java.net/~sherman/7084245/webrev/src/share/classes/sun/misc/ProxyGenerator.java-.html

    里面的注释写的非常清晰,可以参考。

    2、感觉JDK里面这个代码写的不是特别好,NetBean里面的可能进行修正了,这个效果不错:

    http://kickjava.com/src/org/netbeans/mdr/util/ImplGenerator.java.htm

    3、SF上这个工程也不错:

    http://rejava.sourceforge.net/hello_en.html

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/2677278.html
Copyright © 2011-2022 走看看