测试结果如下:

文章插图
反射性能测试结果
测试结论:
- 反射的确会导致性能问题;推荐看下《Java反射是什么?》够了 。
- 反射导致的性能问题是否严重跟使用的次数有关系 , 如果控制在100次以内 , 基本上没什么差别 , 如果调用次数超过了100次 , 性能差异会很明显;
- 四种访问方式 , 直接访问实例的方式效率最高;其次是直接调用方法的方式 , 耗时约为直接调用实例的1.4倍;接着是通过反射访问实例的方式 , 耗时约为直接访问实例的3.75倍;最慢的是通过反射访问方法的方式 , 耗时约为直接访问实例的6.2倍;
首先测试invoke和set方法 , 修改getReflectCallMethodCostTime和getReflectCallFieldCostTime方法的代码如下:
private long getReflectCallMethodCostTime(int count){ long startTime = System.currentTimeMillis(); ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12); Method setmLanguageMethod = null; try{ setmLanguageMethod = programMonkey.getClass().getMethod("setmLanguage", String.class); setmLanguageMethod.setAccessible(true); }catch(NoSuchMethodException e){ e.printStackTrace(); } for(int index = 0 ; index < count; index++){ try{ setmLanguageMethod.invoke(programMonkey, "Java"); }catch(IllegalAccessException e){ e.printStackTrace(); }catch(InvocationTargetException e){ e.printStackTrace(); } } return System.currentTimeMillis()-startTime; } private long getReflectCallFieldCostTime(int count){ long startTime = System.currentTimeMillis(); ProgramMonkey programMonkey = new ProgramMonkey("小明", "男", 12); Field ageField = null; try{ ageField = programMonkey.getClass().getDeclaredField("mLanguage"); }catch(NoSuchFieldException e){ e.printStackTrace(); } for(int index = 0 ; index < count; index++){ try{ ageField.set(programMonkey, "Java"); }catch(IllegalAccessException e){ e.printStackTrace(); } } return System.currentTimeMillis()-startTime; }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 拒做PB Boy!教你巧用 Protobuf 反射来优化代码
- Win10的兼容性到底有多强,你甚至可以运行16位的上古程序
- 如何在JavaScript中对对象数组进行排序
- Java内存泄漏、性能优化、宕机死锁的N种姿势
- 排名前5的JavaScript框架
- Linux 上部署 Java 应用绕不开的命令,撒花啦
- 买茶到底去哪里买,买就送玻璃杯萧氏毛尖自饮绿茶茶叶高山云雾茶日照原产嫩芽栗香味浓120g
- java 实现 SelectSort 选择排序算法详解
- 六安瓜片到底怎么样,安徽六安六安瓜片
- 凉水泡茶有什么危害吗,茶烟到底对身体有害吗
