怎么提升反射的效率

  1. 缓存重复用到的对象
Class clz = Class.forName("com.example.studynote.reflection.User");
while (i < 1000000) {
    i++;
    //方法1,直接实例化
    user = new User();
    //方法2,每次都通过反射获取class,然后实例化
    user = (User) Class.forName("com.example.studynote.reflection.User").newInstance();
    //方法3,通过之前反射得到的class进行实例化
    user = (User) clz.newInstance();
}

得到的实际结果就是:方法一 > 方法三 > 方法二
  1. setAccessible(true)

之前我们说过当遇到私有变量和方法的时候,会用到setAccessible(true)方法关闭安全检查。这个安全检查其实也是耗时的。所以我们在反射的过程中可以尽量调用setAccessible(true)来关闭安全检查,无论是否是私有的,这样也能提高反射的效率。

  1. ReflectASM

他的原理是通过ASM库,生成了一个新的类,然后相当于直接调用新的类方法,从而完成反射的功能。

感兴趣的可以去看看源码,实现原理比较简单——
https://github.com/EsotericSoftware/reflectasm。

小总结:经过上述三种方法,我想反射也不会那么可怕到大大影响性能的程度了,如果真的发现反射影响了性能以及实际使用的情况,也许可以研究下,是否是因为没用对反射和没有处理好反射相关的缓存呢?

你可能感兴趣的:(怎么提升反射的效率)