加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

如何提高使用Java反射的效率?

发布时间:2019-04-27 06:02:55 所属栏目:建站 来源:深夜里的程序猿
导读:前言 在我们平时的工作或者面试中,都会经常遇到反射这个知识点,通过反射我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是反射很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用

其实通过代码我们可以发现,是Class.forName这个方法比较耗时,它实际上调用了一个本地方法,通过这个方法来要求JVM查找并加载指定的类。所以我们在项目中使用的时候,可以把Class.forName返回的Class对象缓存起来,下一次使用的时候直接从缓存里面获取,这样就极大的提高了获取Class的效率。同理,在我们获取Constructor、Method等对象的时候也可以缓存起来使用,避免每次使用时再来耗费时间创建。

测试反射调用方法

  1. @Test  
  2. public void testReflexMethod() throws Exception {  
  3.     long start = System.currentTimeMillis();  
  4.     Class testUserClass = Class.forName("RefleDemo.TestUser");  
  5.     TestUser testUser = (TestUser) testUserClass.newInstance();  
  6.     Method method = testUserClass.getMethod("sayHi");  
  7.     int i = 0;  
  8.     while(i<100000000){  
  9.         ++i;  
  10.         method.invoke(testUser);  
  11.     }  
  12.     long end = System.currentTimeMillis();  
  13.     System.out.println("反射调用方法耗时:"+(end - start ) + "ms");  
  14. }  
  15. //反射调用方法耗时:330ms  
  1. @Test  
  2. public void testReflexMethod() throws Exception {  
  3.     long start = System.currentTimeMillis();  
  4.     Class testUserClass = Class.forName("RefleDemo.TestUser");  
  5.     TestUser testUser = (TestUser) testUserClass.newInstance();  
  6.     Method method = testUserClass.getMethod("sayHi");  
  7.     int i = 0;  
  8.     while(i<100000000){  
  9.         ++i;  
  10.         method.setAccessible(true);  
  11.         method.invoke(testUser);  
  12.     }  
  13.     long end = System.currentTimeMillis();  
  14.     System.out.println("setAccessible=true 反射调用方法耗时:"+(end - start ) + "ms");  
  15. }  
  16. //setAccessible=true 反射调用方法耗时:188ms 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读