当前位置:网站首页 > Java基础 > 正文

java基础不牢固



简介

代理模式在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方法。

版权声明


相关文章:

  • java基础测试企业面试题2024-11-08 17:42:06
  • 晋中java零基础2024-11-08 17:42:06
  • java面试说基础差2024-11-08 17:42:06
  • java基础部分82024-11-08 17:42:06
  • Java基础面试笔记2024-11-08 17:42:06
  • 初中没有基础能学java吗2024-11-08 17:42:06
  • 计算机应用基础java2024-11-08 17:42:06
  • java基础入门第2版答案2024-11-08 17:42:06
  • java基础 兄弟连2024-11-08 17:42:06
  • java基础1942024-11-08 17:42:06