java 反射 速度_Java反射获取实例的速度对比分析
之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里。代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(className).getDeclaredConstructor().newInstance()获取实例对象。
后来同事看到了代码,对这个HashMap里存储方式提出了建议,之前的Map是完全可以改成
后来我测试了一下两者实例化一个对象的速度:
public static void main(String[] args) {
try {
int MAX = 100000;
for (int count = 0; count < 50; count++) {
System.out.println("====第" + count+"次");
long s1 = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
Person o = (Person)Class.forName("com.qingtai.domin.Person").newInstance();
}
long e1 = System.currentTimeMillis();
System.out.println("1_duration:" + (e1 - s1));
long s2 = System.currentTimeMillis();
Class clazz = Class.forName("com.qingtai.domin.Person");
for (int i = 0; i < MAX; i++) {
Person person = (Person) clazz.newInstance();
}
long e2 = System.currentTimeMillis();
System.out.println("2_duration:" + (e2 - s2));
}
} catch (Exception e) {
e.printStackTrace();
}
}
输出:
====第39次 1_duration:72 2_duration:3 ====第40次 1_duration:79 2_duration:12 ====第41次 1_duration:92 2_duration:8 ====第42次 1_duration:80 2_duration:5
结论:
Map的value不存储全路径名,在初始化的时候Map的value直接存储Class对象,在反射过程中速度提升很大。
补充知识:java反射获取类实例并调用私有方法
我就废话不多说了,大家还是直接看代码吧~
public class TestReflect {//测试类
public void mPublic() {//访问权限最大
System.out.println("public run");
}
protected void mProtected() {//同包下才能访问(实验对象)
System.out.println("protected run");
}
private void mPrivate() {//只有本类中才能访问(实验对象)
System.out.println("private run");
}
}
public static void main(String[] args) throws Exception {
Class> class1 = null;
// 反射获取类实例,用的最多的就是jdbc获取驱动的时候就是用Class.forName("xxx");
// 一般采用这种形式
class1 = Class.forName("com.xxx.TestReflect");
// class1 = new TestReflect().getClass();
// class1 = TestReflect.class;
// 类实例化,到这里就可以访问TestReflect类的public属性的成员方法和成员变量了
TestReflect tr = (TestReflect) class1.newInstance();
// 通过java.lang.Class类得到一个Method对象
// api中java.lang.Class.getDeclaredMethod方法介绍
// 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method method = class1.getDeclaredMethod("mPrivate");
Method method1 = class1.getDeclaredMethod("mProtected");
//将此对象的 accessible 标志设置为指示的布尔值。
//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
//值为 false 则指示反射的对象应该实施 Java 语言访问检查。
method.setAccessible(true);
method1.setAccessible(true);
// 调用该方法
method.invoke(tr);
method1.invoke(tr);
}
以上这篇Java反射获取实例的速度对比分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。
java 反射 速度_Java反射获取实例的速度对比分析相关推荐
- java 反射 速度_Java反射,但速度更快
java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...
- java 反射 速度_Java 反射获取类方法速率和实现方式
今天突然想到Java反射.然后测试了一下1.8.0_191版本的反射性能,没想到反射竟然比直接调用性能还高. 反射介绍 Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法.对于任何一 ...
- java反射基础_Java反射基础(一)--Class对象获取
ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...
- java反射 枚举_Java反射应用之获取枚举类的枚举
Java反射实际应用 实际工作中使用到的Java反射并不是很多,我接触到的基本上都是工具类中相对比较常用一些,本篇文章就是我实际工作中遇到的场景. 应用场景:一个审批流程第一个节点审批时,需要填写第二 ...
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- java反射模式_Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...
- java映射理解_Java反射的理解
Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...
- java反射类型转换_Java反射探索研究(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...
- java 反射练习_JAVA反射的基础学习
反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...
最新文章
- python动态图-python之最炫抖音动态图
- 根据文法画出语法树_几种常用的英语教学法误导了语法教学
- 【ARM】Tiny4412裸板编程之蜂鸣器(C语言)
- Scrapy 框架【学习笔记01】
- python爬虫数据可视化软件_python爬虫及数据可视化分析
- UVa 12657 - Boxes in a Line ( 双向链表 )
- 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
- 严格对角占优矩阵特征值_二次型和特征值
- TUXEDO运行监控命令概述
- python编程入门第3版pdf-Python编程入门第三版
- 阅历总结:运用IBM DB2数据库的详细事变
- (可更新)计算机算法设计与分析 第4版 (王晓东) 课后答案[1-9章]
- C语言如何区别素数和合数,怎么快速记住100以内的素数和合数
- 你沐浴后的味道,根本让人把持不住!留香24小时,比喷了大牌香水还迷人!...
- 简单证明圆锥体积为三分之一圆柱
- 《卓有成效的管理者》笔记,第一章 卓有成效是可以学会的
- AOP的两种动态代理机制
- linux结束后台命令,linux 终端的后台任务结束详解
- 如何搭建一台深度学习的电脑工作站
- 微信小程序-云开发, 云函数, 云数据库
热门文章
- parfile解决exp时tables过多问题
- arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
- oracle ORA-01113的解决方法(file 1 needs media recovery)
- 打开PDF文件弹出阅读未加标签文档的解决方法
- 解决页面使用overflow: scroll在iOS上滑动卡顿的问题
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
- python关于解决‘\u‘开头的字符串转中文的方法
- Java中的接口命名[关闭]
- 如何使用JavaScript将数据附加到div?
- 如何在Oracle上使用AUTO_INCREMENT创建ID?