2024年java基础不牢固

java基础不牢固简介 代理模式在 Java 中有很多应用场景 而代理又分静态代码和动态代理 静态代理是编写 编译或加载时织入代码实现 而动态代理则在运行时实现 简单而言 静态代理是在运行前就已经存在 而动态代理则在运行时才存在的 而常用的动态代理有两种实现 JDK Proxy JDK Proxy 是 JDK 自带的 不需要引入外部库 通过实现接口进行代理 CGLib CGLib 是引入第三方库

大家好,我是讯享网,很高兴认识大家。



简介

代理模式在Java中有很多应用场景,而代理又分静态代码和动态代理。静态代理是编写、编译或加载时织入代码实现,而动态代理则在运行时实现。简单而言,静态代理是在运行前就已经存在,而动态代理则在运行时才存在的。而常用的动态代理有两种实现:

  • JDK Proxy: JDK Proxy是JDK自带的,不需要引入外部库,通过实现接口进行代理;
  • CGLib: CGLib是引入第三方库,通过ASM技术来实现字节码的生成;通过继承的方式来实现。

现在我们来通过代码分别展示一下两种方式。

JDK Proxy

JDK Proxy是通过实现接口来实现代理的,我们先定义一个接口:

接着有一个实现类:

讯享网

然后我们需要定义一个来改动方法的逻辑,就是目标被代理后有什么不同:

 

这里我们在方法调用前后加了日志,同时也计算了一下方法的执行时间。

最终在调用的时候如下:

讯享网

通过方法会生成一个代理的实例,执行这个实例的方法,而原有实例被代理了。

执行结果如下:

java基础不牢固
 

查看代理类

我们还可以查看生成的代理类,可以通过添加VM参数:

 

当然,也可以在Java代码中设置系统属性来实现。

设置完成,再执行程序,就会生成代理类的.class文件。

java 越跑越慢怎么处理_动态代理

CGLib

CGLib是通过继承来实现的,我们先来定义一个类:

 

然后定义一个Interceptor,这个类的作用就是生成代理实例,且定义如何改变目标方法的执行:

 

这里同样是在方法前后加了日志,同时记录时长。

调用如下:

 

这里设置系统属性是为了把生成的代理类输出到文件中,方便学习查看。

执行结果如下:

 

总结

JDK Proxy本质上使用的是反射的机制,而CGLib使用的是ASM,CGLib速度会更好。但它们都不支持final的类和方法,因为通过接口和继承都无法改变final方法。

小讯
上一篇 2024-12-26 22:43
下一篇 2024-12-27 10:37

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10244.html