简介
代理模式在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://51itzy.com/kjqy/10244.html