之前代码有一个逻辑,是在初始化时读取某个包下的所有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反射获取实例的速度对比分析相关推荐

  1. java 反射 速度_Java反射,但速度更快

    java 反射 速度 在编译时不知道Java类的最快方法是什么? Java框架通常会这样做. 很多. 它可以直接影响其性能. 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成. 用例 ...

  2. java 反射 速度_Java 反射获取类方法速率和实现方式

    今天突然想到Java反射.然后测试了一下1.8.0_191版本的反射性能,没想到反射竟然比直接调用性能还高. 反射介绍 Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法.对于任何一 ...

  3. java反射基础_Java反射基础(一)--Class对象获取

    ClassesJava中,任何一个对象要么是一个引用类型要么是基本数据类型.引用类型指的是那些直接或间接 Java.lang.Object的类.Classse,enum,和接口都是应用类型.基本类型是 ...

  4. java反射 枚举_Java反射应用之获取枚举类的枚举

    Java反射实际应用 实际工作中使用到的Java反射并不是很多,我接触到的基本上都是工具类中相对比较常用一些,本篇文章就是我实际工作中遇到的场景. 应用场景:一个审批流程第一个节点审批时,需要填写第二 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. python动态图-python之最炫抖音动态图
  2. 根据文法画出语法树_几种常用的英语教学法误导了语法教学
  3. 【ARM】Tiny4412裸板编程之蜂鸣器(C语言)
  4. Scrapy 框架【学习笔记01】
  5. python爬虫数据可视化软件_python爬虫及数据可视化分析
  6. UVa 12657 - Boxes in a Line ( 双向链表 )
  7. 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
  8. 严格对角占优矩阵特征值_二次型和特征值
  9. TUXEDO运行监控命令概述
  10. python编程入门第3版pdf-Python编程入门第三版
  11. 阅历总结:运用IBM DB2数据库的详细事变
  12. (可更新)计算机算法设计与分析 第4版 (王晓东) 课后答案[1-9章]
  13. C语言如何区别素数和合数,怎么快速记住100以内的素数和合数
  14. 你沐浴后的味道,根本让人把持不住!留香24小时,比喷了大牌香水还迷人!...
  15. 简单证明圆锥体积为三分之一圆柱
  16. 《卓有成效的管理者》笔记,第一章 卓有成效是可以学会的
  17. AOP的两种动态代理机制
  18. linux结束后台命令,linux 终端的后台任务结束详解
  19. 如何搭建一台深度学习的电脑工作站
  20. 微信小程序-云开发, 云函数, 云数据库

热门文章

  1. parfile解决exp时tables过多问题
  2. arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
  3. oracle ORA-01113的解决方法(file 1 needs media recovery)
  4. 打开PDF文件弹出阅读未加标签文档的解决方法
  5. 解决页面使用overflow: scroll在iOS上滑动卡顿的问题
  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(13)-系统日志和异常的处理③
  7. python关于解决‘\u‘开头的字符串转中文的方法
  8. Java中的接口命名[关闭]
  9. 如何使用JavaScript将数据附加到div?
  10. 如何在Oracle上使用AUTO_INCREMENT创建ID?