为什么总说Java的反射效率低?

前言动态代理分为两种,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反射:

  1. 动态化的调用使得JIT编译优化没法做
  2. newInstance创建Object,getDeclareMethod,Method.invoke()耗时
ASM,Cglib:
可以直接生成class文件或在class load之前修改class文件
修改class文件 -> 生成$Proxy类 -> load到jvm,这样一个过程,所以第一次会慢一些,但一旦载入jvm之后,就跟普通的Java类一样了,对象的方法调用也是可以被JIT优化的了 。
避免大量循环使用反射调用,


    推荐阅读