Java反射

使用”对象”.class不能进行第一次静态初始化,使用class.forName()会进行第一次初始化

子类对象 install of 父类 true

子类.class == 子类对象 getClass true

getDeclaredAnnotation

getDeclaredClassed

getDeclaredConstructor

getDeclaredField

getDeclaredMethod

getMethods 返回 本类、父类、父类接口的 public方法
getDeclaredMethods 返回本类的所有方法

method可以 invoke()
constructor 可以使用newInstance 构造对象
Field 可以用来 get set值

method.getModifiers()

如何提高反射效率

使用高性能反射包 reflectAsm
缓存反射对象 避免每次都要去重复字节码中获取
method反射可以设置method.setAccessible(true)来关闭检查
尽量不要使用getMethods后再遍历删选 直接使用getMethod(name)来根据方法名获取
getMethods返回数组时,每个method都做了一次拷贝
getMethod只会返回拷贝的方法

jvm会缓存method,但是返回给外部时返回一个拷贝

反射是线程安全的,通过cas获取

普通方法 10亿 9ms
反射方法 10亿 5699ms
关闭检测 10亿 1959ms

普通方法和反射方法的差距

1、Method#invoke方法会对参数做封装和解封装操作
2、需要检查发放的可见性
3、需要校验参数
4、放射方法难以内敛
5、JIT无法优化