简介
代理模式在Java中有很多应用场景,而代理又分静态代码和动态代理。静态代理是编写、编译或加载时织入代码实现,而动态代理则在运行时实现。简单而言,静态代理是在运行前就已经存在,而动态代理则在运行时才存在的。而常用的动态代理有两种实现:
- JDK Proxy: JDK Proxy是JDK自带的,不需要引入外部库,通过实现接口进行代理;
- CGLib: CGLib是引入第三方库,通过ASM技术来实现字节码的生成;通过继承的方式来实现。
现在我们来通过代码分别展示一下两种方式。
JDK Proxy
JDK Proxy是通过实现接口来实现代理的,我们先定义一个接口:
接着有一个实现类:
然后我们需要定义一个来改动方法的逻辑,就是目标被代理后有什么不同:
这里我们在方法调用前后加了日志,同时也计算了一下方法的执行时间。
最终在调用的时候如下:
通过方法会生成一个代理的实例,执行这个实例的方法,而原有实例被代理了。
执行结果如下:
查看代理类
我们还可以查看生成的代理类,可以通过添加VM参数:
当然,也可以在Java代码中设置系统属性来实现。
设置完成,再执行程序,就会生成代理类的.class文件。
CGLib
CGLib是通过继承来实现的,我们先来定义一个类:
然后定义一个Interceptor,这个类的作用就是生成代理实例,且定义如何改变目标方法的执行:
这里同样是在方法前后加了日志,同时记录时长。
调用如下:
这里设置系统属性是为了把生成的代理类输出到文件中,方便学习查看。
执行结果如下:
总结
JDK Proxy本质上使用的是反射的机制,而CGLib使用的是ASM,CGLib速度会更好。但它们都不支持final的类和方法,因为通过接口和继承都无法改变final方法。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/19509.html