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

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

发布时间:2019-04-29 05:51:22 所属栏目:建站 来源:深夜里的程序猿
导读:媒介 在我们平常的事变可能口试中,城市常常碰着反射这个常识点,通过反射我们可以动态的获取到工具的信息以及机动的挪用工具要领等,可是在行使的同时又陪伴着另一种声音的呈现,那就是反射很慢,要罕用。莫非反射真的很慢?那跟我们平常正常建设工具挪用
副问题[/!--empirenews.page--]

 怎样进步行使Java反射的服从?

媒介

在我们平常的事变可能口试中,城市常常碰着“反射”这个常识点,通过“反射”我们可以动态的获取到工具的信息以及机动的挪用工具要领等,可是在行使的同时又陪伴着另一种声音的呈现,那就是“反射”很慢,要罕用。莫非反射真的很慢?那跟我们平常正常建设工具挪用要领比慢几多? 预计许多人都没去测试过,只是”耳食之闻“。下面我们就直接通过一些测试用例来直观的感觉一下”反射“。

正文

筹备测试工具

下面先界说一个测试的类TestUser,只有id跟name属性,以及它们的getter/setter要领,其它尚有一个自界说的sayHi要领。

  1. public class TestUser {  
  2.     private Integer id;  
  3.     private String name;   
  4.     public String sayHi(){  
  5.         return "hi";  
  6.     }  
  7.     public Integer getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(Integer id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  

测试建设100万个工具

  1. // 通过平凡方法建设TestUser工具  
  2. @Test  
  3. public void testCommon(){  
  4.     long start = System.currentTimeMillis();  
  5.     TestUser user = null;  
  6.     int i = 0;  
  7.     while(i<1000000){  
  8.         ++i;  
  9.         user = new TestUser();  
  10.     }  
  11.     long end = System.currentTimeMillis();  
  12.     System.out.println("平凡工具建设耗时:"+(end - start ) + "ms");  
  13. }  
  14. //平凡工具建设耗时:10ms  
  15. // 通过反射方法建设TestUser工具  
  16. @Test  
  17. public void testReflexNoCache() throws Exception {  
  18.     long start = System.currentTimeMillis();  
  19.     TestUser user = null;  
  20.     int i = 0;  
  21.     while(i<1000000){  
  22.         ++i;  
  23.         user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance();  
  24.     }  
  25.     long end = System.currentTimeMillis();  
  26.     System.out.println("无缓存反射建设工具耗时:"+(end - start ) + "ms");  
  27. }  
  28. //无缓存反射建设工具耗时:926ms 

在上面这两个测试要领中,笔者各自测了5次,把他们耗损的时刻取了一个均匀值,在输出功效中可以看到一个是10ms,一个是926ms,在建设100W个工具的环境下,反射居然慢了90倍阁下。wtf?差距居然这么大?莫非反射真的这么慢?下面笔者换一种反射的姿势,继承测试一下,看当作果怎样?

  1. // 通过缓存反射方法建设TestUser工具  
  2. @Test  
  3. public void testReflexWithCache() throws Exception {  
  4.     long start = System.currentTimeMillis();  
  5.     TestUser user = null;  
  6.     Class rUserClass = Class.forName("RefleDemo.TestUser");  
  7.     int i = 0;  
  8.     while(i<1000000){  
  9.         ++i;  
  10.         user = (TestUser) rUserClass.newInstance();  
  11.     }  
  12.     long end = System.currentTimeMillis();  
  13.     System.out.println("通过缓存反射建设工具耗时:"+(end - start ) + "ms");  
  14. }  
  15. //通过缓存反射建设工具耗时:41ms 

咦?这种操纵只必要41ms了,大大进步了反射建设工具的服从。为什么会快这么多呢?

(编辑:河北网)

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

热点阅读