前言动态代理分为两种,JDK动态代理和spring里边使用的Cglib动态代理 。分别使用的是interface和子类继承的思路来对委托类进行wrap生成代理类 。
一直据说由于JDK动态代理使用的是反射的方式对委托类的方法进行调用,性能低,而cglib使用的是字节码修改的方式,性能高 。
本篇就尝试搞清楚低为什么低,而高为什么高 。
以下分析环境所用的jdk版本:
JAVA version "1.8.0_202"Java(TM) SE Runtime Environment (build 1.8.0_202-b08)Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
java反射:
- 动态化的调用使得JIT编译优化没法做
- newInstance创建Object,getDeclareMethod,Method.invoke()耗时
可以直接生成class文件或在class load之前修改class文件
修改class文件 -> 生成$Proxy类 -> load到jvm,这样一个过程,所以第一次会慢一些,但一旦载入jvm之后,就跟普通的Java类一样了,对象的方法调用也是可以被JIT优化的了 。
避免大量循环使用反射调用,
推荐阅读
- Java 工程师相见恨晚的神兵利器和使用技巧
- JAVA RSA加密解密 工具类
- 办了1000M宽带,为什么网速不见提升?安装小哥:自查6个“设备”
- 为什么冬天要喝红茶,天天喝红枣姜茶的功效与作用
- JavaScript 继承全解析
- 2022:为什么 NestJS 是最好的后端框架
- JAVA三大框架
- JavaScript面向对象—继承的实现
- 喝红茶的功效与作用,碧螺春红茶的功效
- 为什么春季一到就容易犯困