java反射优化_JAVA反射优化
****************** 转自 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反射优化相关推荐
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- java反射模式_Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...
- java 提高反射性能_java反射性能
项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...
- java 反射代价_Java反射机制
# 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...
- java split()方法_Java 性能优化的 50 个细节(珍藏版)
作 者:Java杂记 来 源:yq.aliyun.com/articles/662001 在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...
- Java的反射作用_java反射机制的作用与优点
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...
- java映射理解_Java反射的理解
Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...
- java反射方法_java反射之方法反射的基本操作方法
本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...
- java反射类型转换_Java反射探索研究(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...
- java 反射练习_JAVA反射的基础学习
反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...
最新文章
- 操作索引库-mapping属性
- 美团科技 Java工程师_美团网java工程师面试都会问哪些问题?
- 【FFMPEG中PTS与DTS统一转换为毫秒】
- C# MVC 用户登录状态判断
- 【Photoshop教程】转发:Photoshop把帅哥转成超酷的阿凡达
- 什么是死亡之 Ping 攻击?
- 3.接口测试用例书写
- android7.1刷supersu,Android怎么刷SuperSU 安卓系统刷SuperSU Pro教程
- 数仓学习笔记(7)——数仓搭建(DWT层)
- Python基础01 Hello World!
- 实训任务04 MapReduce编程入门
- 仿淘宝商品详情页[带有视频和图片的轮播功能]
- 求一个n*n矩阵对角线元素之和C语言,求一个n*n矩阵主对角线之和,次对角线元素之和.用指针完成...
- 100个小学生猜字谜大全及答案
- C语言读取midi文件,《MIDI指令协议格式》.doc
- java面试题120题
- 计算机cpu频率时钟周期,关于cpu:什么是时钟周期和时钟速度?
- U盘坏了数据可以恢复吗?超详细的U盘数据恢复图文教程!
- 医疗器械经营与服务类毕业论文文献有哪些?
- java从数据库导出语音文件_从数据库导出数据
热门文章
- Microsoft Outlook 邮件分组
- mysql 5.7 多线程主从复制_Mysql 5.7从节点配置多线程主从复制的方法详解
- 【Oracle】redo与undo
- 解决微信小程序使用switchTab跳转后页面不刷新的问题
- java网络爬虫,乱码问题终于完美解决
- ORACLE数据库多表关联查询效率问题解决方案
- 用jsonp 解决跨域问题
- HBase中此类异常解决记录org.apache.hadoop.ipc.RemoteException(java.io.IOException):
- nginx504超时解决方法
- IIS网站无法播放视频的解决方法