FEATURED · 精选文章

Java开发中那些可以提升性能/效率的小技巧(持续更新)

发布时间 / 2026/9/18 13:04:06
来源 / 创域科博编辑部
栏目 / 资讯中心
Java开发中那些可以提升性能/效率的小技巧(持续更新) 文章目录一、Java基础1、使用反射时做好缓存2、public类型的Method尽量也setAccessible(true)3、不要在方法级别使用Class.forName4、高并发下少做类型转换能用基本类型就基本类型5、参考资料一、Java基础1、使用反射时做好缓存日常开发中经常会用到反射尤其是SpringAOP或者其他场景但是经常会忽略其性能反射的性能确实比普通的方法性能差很多。下面是我们日常开发时使用反射的示例100W次执行需要280毫秒importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.Date;publicclassTest{publicstaticvoidmain(String[]args)throwsNoSuchMethodException,InvocationTargetException,IllegalAccessException{TesttestnewTest();DatestartnewDate();for(inti0;i1000000;i){Methodtest1Test.class.getDeclaredMethod(test1,String.class);Objectinvoketest1.invoke(test,123);}System.out.println(newDate().getTime()-start.getTime());// 280}publicvoidtest1(Stringparam){inti0;i;}}加上Map缓存我们查看一下性能importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.Date;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;publicclassTest{privatestaticMapString,MethodmapnewConcurrentHashMap();publicstaticvoidmain(String[]args)throwsNoSuchMethodException,InvocationTargetException,IllegalAccessException{TesttestnewTest();DatestartnewDate();for(inti0;i1000000;i){// Map缓存Methodtest1map.computeIfAbsent(Test.class.getName()test1,k-{try{returnTest.class.getDeclaredMethod(test1,String.class);}catch(NoSuchMethodExceptione){e.printStackTrace();}returnnull;});Objectinvoketest1.invoke(test,123);}System.out.println(newDate().getTime()-start.getTime());// 140}publicvoidtest1(Stringparam){inti0;i;}}前后经过对比280ms和140ms能差一倍的性能但是这是100万次反射获取方法280毫秒其实对于一般系统来说也影响不大了如果是追求极致的并发或许可以考虑一下为反射添加缓存。2、public类型的Method尽量也setAccessible(true)setAccessible可以将方法、字段的检查设置为true跳过检查默认是false需要进行检查既private、protected等检查。相当于将java.lang.reflect.AccessibleObject中override字段设置为true了如果通过反射调用方法时需要进行override字段的校验而这段代码中包含了不少的反射逻辑及native方法调用日常开发中以及某些Spring的代码中对于字段或者方法设置Access时public类型的就不进行setAccessible(true)的操作了当然这对于最终的结果并没有影响但是最好是全都进行setAccessible(true)的操作这会跳过一大段检查的逻辑org.springframework.util.ReflectionUtils#makeAccessible(java.lang.reflect.Constructor?)建议去掉判断直接进行setAccessible(true)的操作不管类是否是public的、不管方法和字段是public的。3、不要在方法级别使用Class.forName调用Class.forName方法时会执行Classloader的loadClass方法这个方法是带着synchronized的所以在并发情况下会有锁竞争的场景比如说Spring中的依赖注入为了检查Inject类是否存在在构造方法中做了检查。当然这里也不会有什么并发问题该构造方法也只会调用一次。正确的方法是在static块中进行调用4、高并发下少做类型转换能用基本类型就基本类型// 能用基本类型就基本类型少用字符串intstatus1;if(status1){...}// 类型转换影响性能LongidLong.parseLong(idStr);5、参考资料https://mp.weixin.qq.com/s/B-IPbwcQr3yp8_BJMKvdbA
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻