[学习原创] java.lang.reflect.Proxy使用

本文详细解析Spring AOP的基本实现原理,重点介绍动态代理模式及其实现过程,通过代码分析和实例展示,深入理解Spring AOP的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近没事,看了一下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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值