所以我们只能想办法优化反射,而不能抵制反射,那么优化方案,这里给大家推荐了ReflectASM。 一、性能对比 我们先通过简单的代码来看看,各种调用方式之间的性能差距。...缓存反射耗时"+(System.currentTimeMillis() - now) + "ms秒); //---------------------reflectasm...System.currentTimeMillis() - now) + "ms); } 每种方式执行500W次运行结果如下: get耗时21ms 标准反射耗时5397ms 缓存反射耗时315ms reflectasm...而reflectasm反射效率要在java传统的反射之上快了接近1/3. 二、reflectasm原理解析。 ReflectASM是一个很小的java类库,主要是通过asm生产类来实现java反射。...但是它的get方法同样会消耗很大的时间,因此就算是使用ReflectASM的朋友也记得请在启动的时候就初始化get方法计入缓存。
由于项目里存在反射的性能瓶颈,使用的是ReflectASM高性能反射库来优化。 因此,在空闲时间研究了下的这个库,并做了简单的Beachmark。 介绍 ReflectASM是使用字节码生成来加强反射的性能。 反射包含多种反射,这个库很简单,它提供的特性则是: 根据匹配的字符串操作成员变量。 根据匹配的字符串调用成员函数。...所以,如果在代码中封装这样的一个函数试图使用ReflectASM库: Object reflectionInvoke(Object bean, String methodName) { MethodAccess...最后总结 在使用ReflectASM对某类进行反射调用时,需要预先生成或获取字节码动态生成的MethodAccess子类对象。...如果是自己里面ReflectASM封装工具类,则应该设计缓存,缓存生成的MethodAccess对象。 如果不这样做,这个ReflectASM用的没有任何意义,性能还不如java的原生反射。
kryo-serializers-0.42.jar [root@tomcat1 we]# wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm.../1.11.0/reflectasm-1.11.0.jar [root@tomcat1 we]# wget https://repo1.maven.org/maven2/com/esotericsoftware...kryo-serializers-0.42.jar [root@tomcat1 we]# wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm.../1.11.0/reflectasm-1.11.0.jar [root@tomcat1 we]# wget https://repo1.maven.org/maven2/com/esotericsoftware
3、ReflectASM ReflectASM 是一个非常小的 Java 类库,通过代码生成来提供高性能的反射处理,自动为 get/set 字段提供访问类,访问类使用字节码操作而不是 Java 的反射技术...感兴趣的可以去看看源码,实现原理比较简单——https://github.com/EsotericSoftware/reflectasm。
executeMethod(coreClassName, "checkLicense",startCheck); } } 为了避免反射调用随着调用次数的增加损失较多的性能,使用了一个第三方的插件reflectasm...增加依赖 com.esotericsoftware reflectasm... 1.11.0 reflectasm使用了MethodAccess快速定位方法并在字节码层面进行调用
esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar wget http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm.../1.11.3/reflectasm-1.11.3.jar wget http://repo1.maven.org/maven2/org/objenesis/objenesis/2.4/objenesis
类反射的性能优化不是什么新课题,因此有一些成熟的第三方解决方案可以参考,比如运用比较广泛的ReflectASM,据称可以比未经优化的类反射代码提高1/3左右的性能。...(参考资料:Java高性能反射工具包ReflectASM,ReflectASM-invoke,高效率java反射机制原理) 在研究了ReflectASM的源代码以后,我们决定不使用现成的第三方解决方案,...主要基于两点考虑: ReflectASM的基本技术原理,是在运行期动态分析类的结构,把字段、函数建立索引,然后通过索引完成类反射,技术上并不高深,性能也谈不上完美; 类反射是我们系统使用的关键技术,使用场景...思路和实践:缓存优化 前面提到ReflectASM给类的字段、函数建立索引,借此提高类反射效率。进一步分析,这实际上是变相地缓存了字段和函数。
这里介绍一个高性能反射工具包ReflectASM。它是通过字节码生成的方式来实现的反射机制,下面是一个跟java反射的性能比较。 ?
Fail to parse the class name from the Jar file due to the exception:java.io.FileNotFoundException: reflectasm
msm-kryo-serializer-1.6.5.jar tomcat-i18n-es.jar catalina-ha.jar javolution-5.4.3.1.jar reflectasm...msm-kryo-serializer-1.6.5.jar tomcat-i18n-es.jar catalina-ha.jar javolution-5.4.3.1.jar reflectasm
这里介绍一个高性能反射工具包ReflectASM。它是通过字节码生成的方式来实现的反射机制,下面是一个跟java反射的性能比较。
2.1.1.jar memcached-session-manager-tc8-2.1.1.jar minlog-1.2.jar msm-kryo-serializer-2.1.1.jar reflectasm
memcached-session-manager-tc8-1.9.7.ja minlog-1.3.0.ja msm-kryo-serializer-1.9.7.ja objenesis-2.4.ja reflectasm
repository\com\esotericsoftware\kryo\kryo\2.21\kryo-2.21.jar;E:\maven\repository\com\esotericsoftware\reflectasm...\reflectasm\1.07\reflectasm-1.07-shaded.jar;E:\maven\repository\org\ow2\asm\asm\4.0\asm-4.0.jar;E:\maven
将反射得到元数据保存起来,使用时,只需从内存中调用即可,hotspot虚拟机会对执行次数较多的方法进行优化(例如使用jit技术) 5、使用高性能的反射类库ReflectASM(该类库无法反射私有方法和变量
memcached-session-manager-1.5.1.jar memcached-session-manager-tc7-1.5.1.jar minlog-1.2.jar msm-kryo-serializer-1.5.1.jar reflectasm
或者建立索引类(像CGLIB的FastClass),这种做法在父类或者接口方法比较少的时候会有一定的性能提升,但是实际上性能评估需要从具体的场景通过测试分析结果而不能盲目使用,使用这个思想的类库有CGLIB、ReflectASM
2.需要多次动态创建一个类的实例的时候, 有缓存的写法会比没有缓存要快很多: 3.ReflectASM 工具类 , 通过字节码生成的方式加快反射速度。
领取专属 10元无门槛券
手把手带您无忧上云