| 
                        副标题[/!--empirenews.page--]
                            
前言 
在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。 
正文 
准备测试对象 
下面先定义一个测试的类TestUser,只有id跟name属性,以及它们的getter/setter方法,另外还有一个自定义的sayHi方法。 
- public class TestUser {  
 -     private Integer id;  
 -     private String name;   
 -     public String sayHi(){  
 -         return "hi";  
 -     }  
 -     public Integer getId() {  
 -         return id;  
 -     }  
 -     public void setId(Integer id) {  
 -         this.id = id;  
 -     }  
 -     public String getName() {  
 -         return name;  
 -     }  
 -     public void setName(String name) {  
 -         this.name = name;  
 -     }  
 - } 
 
  
测试创建100万个对象 
- // 通过普通方式创建TestUser对象  
 - @Test  
 - public void testCommon(){  
 -     long start = System.currentTimeMillis();  
 -     TestUser user = null;  
 -     int i = 0;  
 -     while(i<1000000){  
 -         ++i;  
 -         user = new TestUser();  
 -     }  
 -     long end = System.currentTimeMillis();  
 -     System.out.println("普通对象创建耗时:"+(end - start ) + "ms");  
 - }  
 - //普通对象创建耗时:10ms  
 - // 通过反射方式创建TestUser对象  
 - @Test  
 - public void testReflexNoCache() throws Exception {  
 -     long start = System.currentTimeMillis();  
 -     TestUser user = null;  
 -     int i = 0;  
 -     while(i<1000000){  
 -         ++i;  
 -         user = (TestUser) Class.forName("ReflexDemo.TestUser").newInstance();  
 -     }  
 -     long end = System.currentTimeMillis();  
 -     System.out.println("无缓存反射创建对象耗时:"+(end - start ) + "ms");  
 - }  
 - //无缓存反射创建对象耗时:926ms 
 
  
在上面这两个测试方法中,笔者各自测了5次,把他们消耗的时间取了一个平均值,在输出结果中可以看到一个是10ms,一个是926ms,在创建100W个对象的情况下,反射居然慢了90倍左右。wtf?差距居然这么大?难道反射真的这么慢?下面笔者换一种反射的姿势,继续测试一下,看看结果如何? 
- // 通过缓存反射方式创建TestUser对象  
 - @Test  
 - public void testReflexWithCache() throws Exception {  
 -     long start = System.currentTimeMillis();  
 -     TestUser user = null;  
 -     Class rUserClass = Class.forName("RefleDemo.TestUser");  
 -     int i = 0;  
 -     while(i<1000000){  
 -         ++i;  
 -         user = (TestUser) rUserClass.newInstance();  
 -     }  
 -     long end = System.currentTimeMillis();  
 -     System.out.println("通过缓存反射创建对象耗时:"+(end - start ) + "ms");  
 - }  
 - //通过缓存反射创建对象耗时:41ms 
 
  
咦?这种操作只需要41ms了,大大提高了反射创建对象的效率。为什么会快这么多呢? 
                                                (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |