网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

如何让ReflectionUtils的反射速度更快一招?

GG网络技术分享 2026-04-17 02:34 2


ReflectionUtils提高反射性能!

小菜先从原生API获取构造器的方法入手

根据你所描述的情况,临床上提睾反射属于人体神经反射中前反射的一种,在进行体格检查的时候又钝头竹签由下向上轻划股内侧上方皮肤可以引起同侧提睾肌收缩,使睾丸上提。如果提高反射出现了迟钝或过度亢奋的情况,就要考虑是否有中枢神经系统的病变,牛逼。。

本篇文章笔记以及案例被收入 Gitee-CaiCaiJava、 Github-CaiCaiJava,除此之外还有更多Java进阶相关知识,感兴趣的同学可以starred持续关注喔~,我晕...

小菜继续向下翻看源码,但是发现 Reflection 欧了! Utils 调用方法的API也是去调用原生的,没有区别

小菜心想:我还以为会在循环上做文章呢,后来啊也是循环查找,复杂度与方法数量有关

4

代码语言:java

java反射工具类ReflectionUtils.反射Reflection被视为动态语言的关键,是一种功能 我狂喜。 强大且复杂的机制,其不仅被应用Java语言中,也被应用在Go语言中,所以呢,它在我们的开发过程中非常重要。

调用方法次数 10_000_000

public Constructor getConstructor throws NoSuchMethodException, SecurityException { //平安管理器检查访问权限 checkMemberAccess, true); //获取构造器 return getConstructor0;}

于是进行只获取构造器的测试:

49

提睾反射是一种正常的生理性浅反射.当检查者用棉签由下向上轻划男性大腿内侧上方皮肤时,会引起同侧提睾肌收缩,使睾丸上提,这种反射被称为提睾反射。 反射需要运行时动态解析类的元数据并查找, 动态解析导致可能无法使用JIT private static Method searchMethods{ Method res = null; String inter 挖野菜。 nedName = ; for { Method m = methods; //查找方法 if == internedName && arrayContentsEq) && .isAssignableFrom))) res = m; } //通过工厂创建对象返回 return .copyMethod);} 原生耗时ms 12 285 3.198s

通过这个表格使用反射1W次才12ms,100W次285ms,1kw次3.198s 关注菜菜,分享更多技术干货,公众号:菜菜的后端私房菜 继续查看原生API获取方法的源码: 3198 经过对比可以发现:ReflectionUtils首次初始化会慢很多,但是后续反射比原生API快 突然小菜认为是JVM参数未设置,突然增加这么多对象,肯定是会堆扩容和GC的 76 原生耗时ms 小菜后续又试了一下千万次循环的数据有下降,但是差不多只有几十毫秒影响不大 12原生反射使用软引用作为缓存,虽然适合内存弹性伸缩,但是gc时会导致缓存丢失需要重新加载,而ReflectionUtils的缓存是强引用不会主要原因是gc而丢失 ReflectionUtils耗时ms 在checkMemberAccess方法中会获取平安管理器检查是否允许访问,但默认情况下是没有平安管理器的 经过测试ReflectionUtils与原生反射的性能对比如下表: private Constructor privateGetDeclaredConstructors { //检查初始化 checkInitted; Constructor res; //获取反射数据 ReflectionData rd = reflectionData; if { res = publicOnly ? : ; //存在数据直接返回 没存在后续要查询 相当于ReflectionData是缓存 if return res; } // No cached value available; request value from VM if ) { @SuppressWarnings Constructor temporaryRes = new Constructor; res = temporaryRes;} else { //不是接口 调用本地方法获取构造器数组 res = getDeclaredConstructors0; } //查到数据 把数据放到缓存 ReflectionData if { if {= res;} else{= res;} } return res;} 继续查看getDeclaredMethods: 提睾反射是男性特有的生理反射之一,通过检查这一反射,医生可以初步判断患者的神经系统功能是否正常.若提睾反射消失或减弱, 可能提示腰髓或神... //代码块 运行后来啊: 在示例中, 我们调用了一个不存在的方法, 紧急抛出异常了。 处理InvokingTargetException处理给定的调用目标异常。 Private Static Class ReflectionData ≪ ;t ≫ ;{Volatile Field DeclaredFields; 2 通过查看ReflectionData字段可以发现, 不止构造器使用缓存, 不同访问权限的字段和方法也会使用缓存. 由此可以看出ReflectionUtils带来的性能提升并不是在获取构造器上, 那只能是“问题”出在方法Method和字段Field上了. JIT即时编译器会将循环次数多的热点代码进行编译成本地码, 而后续不再需要解释施行, 从而进行优化. 算了我还是先去写文档吧。 再来查看ReflectionUtils的API查找方法与原生有什么区别.Private Static Void Springreflection {Constructor ≪ ;reflectionobject ≫ ; Constructor=Null;//Use Construction to Create Instance Reflectionobject Instance=Null;//Find Methods and Call Methods Method Setnamemethod=;//If ){;}//Find Fields and Set Values Field Field=;//If ){;//;}} 这篇笔记已经收入到我的专栏里了哦。 剩下的方法看不出个所以然, 于是小菜决定从案例中的方法对比进行查看:Private Static Void Jdkreflection {Class , ObjectClass=;Try {//Through constructor to create an instance constructor , Objectconstructor=;Object Instance=;//Call method method setnamemethod=;//;//Modify field field field=;//;//catch {Throw New Runtimeexception ;}}} 一下可能耗时的操作: 除了这些因素之外 , 反射动态解析类元数据加载到内存生成Class也会错过一些诸如JIT编译器的性能优化.什么问题可以在评论区交流 , 如果觉得菜菜写的不错 , 可以点赞 、关注 、收藏支持一下 ~.,复盘一下。


提交需求或反馈

Demand feedback