****************** 转自 https://my.oschina.net/19921228/blog/3042643 ***********************

比较反射与正常实例对象的效率

准备测试对象

下面先定义一个测试的类TestUser,只有id跟name属性,以及它们的getter/setter方法,另外还有一个自定义的sayHi方法。

public classTestUser {privateInteger id;privateString name;publicString sayHi(){return "hi";

}publicInteger getId() {returnid;

}public voidsetId(Integer id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

测试创建100万个对象

//通过普通方式创建TestUser对象

@Testpublic voidtestCommon(){long start =System.currentTimeMillis();

TestUser user= null;int i = 0;while(i<1000000){++i;

user= newTestUser();

}long end =System.currentTimeMillis();

System.out.println("普通对象创建耗时:"+(end - start ) + "ms");

}//普通对象创建耗时:10ms

//通过反射方式创建TestUser对象

@Testpublic void testReflexNoCache() throwsException {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对象

@Testpublic void testReflexWithCache() throwsException {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

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

测试反射调用方法

@Testpublic void testReflexMethod() throwsException {long start =System.currentTimeMillis();

Class testUserClass= Class.forName("RefleDemo.TestUser");

TestUser testUser=(TestUser) testUserClass.newInstance();

Method method= testUserClass.getMethod("sayHi");int i = 0;while(i<100000000){++i;

method.invoke(testUser);

}long end =System.currentTimeMillis();

System.out.println("反射调用方法耗时:"+(end - start ) + "ms");

}//反射调用方法耗时:330ms

@Testpublic void testReflexMethod() throwsException {long start =System.currentTimeMillis();

Class testUserClass= Class.forName("RefleDemo.TestUser");

TestUser testUser=(TestUser) testUserClass.newInstance();

Method method= testUserClass.getMethod("sayHi");int i = 0;while(i<100000000){++i;

method.setAccessible(true);

method.invoke(testUser);

}long end =System.currentTimeMillis();

System.out.println("setAccessible=true 反射调用方法耗时:"+(end - start ) + "ms");

}//setAccessible=true 反射调用方法耗时:188ms

这里我们反射调用sayHi方法1亿次,在调用了method.setAccessible(true)后,发现快了将近一半。查看API可以了解到,jdk在设置获取字段,调用方法的时候会执行安全访问检查,而此类操作会比较耗时,所以通过setAccessible(true)的方式可以关闭安全检查,从而提升反射效率。

java反射优化_JAVA反射优化相关推荐

  1. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  2. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  3. java 提高反射性能_java反射性能

    项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...

  4. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  5. java split()方法_Java 性能优化的 50 个细节(珍藏版)

    作 者:Java杂记 来 源:yq.aliyun.com/articles/662001 在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

  6. Java的反射作用_java反射机制的作用与优点

    java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...

  7. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  8. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

  9. java反射类型转换_Java反射探索研究(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...

  10. java 反射练习_JAVA反射的基础学习

    反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...

最新文章

  1. 操作索引库-mapping属性
  2. 美团科技 Java工程师_美团网java工程师面试都会问哪些问题?
  3. 【FFMPEG中PTS与DTS统一转换为毫秒】
  4. C# MVC 用户登录状态判断
  5. 【Photoshop教程】转发:Photoshop把帅哥转成超酷的阿凡达
  6. 什么是死亡之 Ping 攻击?
  7. 3.接口测试用例书写
  8. android7.1刷supersu,Android怎么刷SuperSU 安卓系统刷SuperSU Pro教程
  9. 数仓学习笔记(7)——数仓搭建(DWT层)
  10. Python基础01 Hello World!
  11. 实训任务04 MapReduce编程入门
  12. 仿淘宝商品详情页[带有视频和图片的轮播功能]
  13. 求一个n*n矩阵对角线元素之和C语言,求一个n*n矩阵主对角线之和,次对角线元素之和.用指针完成...
  14. 100个小学生猜字谜大全及答案
  15. C语言读取midi文件,《MIDI指令协议格式》.doc
  16. java面试题120题
  17. 计算机cpu频率时钟周期,关于cpu:什么是时钟周期和时钟速度?
  18. U盘坏了数据可以恢复吗?超详细的U盘数据恢复图文教程!
  19. 医疗器械经营与服务类毕业论文文献有哪些?
  20. java从数据库导出语音文件_从数据库导出数据

热门文章

  1. Microsoft Outlook 邮件分组
  2. mysql 5.7 多线程主从复制_Mysql 5.7从节点配置多线程主从复制的方法详解
  3. 【Oracle】redo与undo
  4. 解决微信小程序使用switchTab跳转后页面不刷新的问题
  5. java网络爬虫,乱码问题终于完美解决
  6. ORACLE数据库多表关联查询效率问题解决方案
  7. 用jsonp 解决跨域问题
  8. HBase中此类异常解决记录org.apache.hadoop.ipc.RemoteException(java.io.IOException):
  9. nginx504超时解决方法
  10. IIS网站无法播放视频的解决方法