如何提高使用Java反射的效率?

JAVA提高反射效率,Java代码精粹,高手实现,反射高效代码 立即下载

难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是“道听途说”。下面我们就直接通过一些测试用例来直观的感受一下“反射”。

前言

在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。

正文

准备测试对象

下面先定义一个测试的类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了,大大提高了反射创建对象的效率。为什么会快这么多呢?

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

@Test  
public void testReflexMethod() throws Exception {  
    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  
@Test  
public void testReflexMethod() throws Exception {  
    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的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

lejian的专栏 1077

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1318

2025最新Java反射性能优化进阶

反射性能详解

Ares_xb的博客 2276

用户消费行为分析(MapReduce实现,Hive分析)

一、题目要求 数据来自CDNow网站的一份用户购买CD明细,本数据集共有 6 万条 左右数据,数据为 CDNow 网站 1997年1月至1998年6月的用户行为 数据

紫烟的博客 3013

大厂嵌入式面试常考八股文及算法

1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。

谢谢大家的关注 6159

Java反射,但速度更快

在编译时不知道Java类的最快方法是什么? Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成。 用例 假设我们有一个简单的Person类,其中包含名称和地址: public class Person { ... public String getName() {...} public Ad...

最佳 Java 编程 480

CentOS7安装OpenSSL1.1.1s

CentOS7安装OpenSSL1.1.1s

Bertram的博客 733

反射调用为什么慢?细推反射细节!

写在前面 ​ Java的反射在日常开发中还是经常用到的技术点,这包括spring的Ioc,包括一些除cglib之外的bean copy(cglib采用asm动态生成字节码来实现),然而在spring的ioc中,我们或许无法感知到,这是因为大部分类实例都是单例,只在容器启动的时候加载一次,并在容器内缓存它的实例。但是在业务code中的beancopy则不然。你会发现请求量大的情况下,很多线程栈都会...

zhang6622056的专栏 3128

Milvus 向量数据库部署方案全景指南:从单机开发到生产级高可用集群

本文系统介绍了Milvus向量数据库的四大部署方案:嵌入式开发利器Milvus Lite、单机简易部署Standalone模式、生产级高可用Cluster模式以及全托管SaaS服务Zilliz Cloud。针对不同应用场景(开发测试、小型应用、大规模生产环境),详细分析了各模式的适用条件、资源配置要求和部署步骤,并提供了关键配置示例。文章强调正确选择部署方案对系统性能至关重要,帮助开发者根据向量规模、QPS和高可用需求,选择最优部署方式,实现资源优化与稳定运行。

reset2021的博客 385

B.3【智能标注】:基于Labelstudio的UIE半监督深度学习的智能标注方案(云端版),提效。

Label Studio 所提供的 Machine Learning Backend 提供了一个比较灵活的辅助人工标注的框架,我们通过它确实可以加快 nlp 数据的标注Label Studio 的 enterprise 版本提供了 Active Learning 的流程,不过从其描述看这个流程并不完美,尤其是 fit 部分,由于 Label Studio 低估了「Train」所花费的时间,所以每次标注都自动训练的流程可能并不会那么顺滑(会在链接时候等待一段时间)

丨汀、的博客 1840

java 反射的效率_如何提高使用Java反射的效率?

前言在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。正文准备测试对象下面先定义一个测试的类...

weixin_29638987的博客 213

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6630

java反射 效率_如何提高使用Java反射的效率?

前言在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。正文准备测试对象下面先定义一个测试的类...

weixin_29214715的博客 277

使用Simulink对固定翼无人机的自动起飞与降落进行仿真

本文介绍了基于Simulink的固定翼无人机自动起飞与降落控制系统设计方法。系统包含飞行器动力学模型、控制系统、环境模拟等模块,通过简化动力学方程描述无人机运动特性。详细说明了从创建模型、设置动力学方程、设计PID控制器(包括自动起飞和降落控制策略)到添加环境模拟的完整仿真流程。重点阐述了升降舵和发动机推力的控制律设计,以及性能评估要点。本方法可有效验证控制系统设计,优化飞行稳定性和安全性参数,为无人机自主控制提供仿真支持。

amy_mhd的博客 223

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 语言效率_如何提高使用Java反射的效率

如何提高使用Java反射的效率发布时间:2020-09-29 16:22:48来源:亿速云阅读:74作者:小新这篇文章将为大家详细讲解有关如何提高使用Java反射的效率,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随...

weixin_36168927的博客 104

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java - 如何提高使用Java反射的效率?

Java - 如何提高使用Java反射的效率?

822

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何提高使用Java反射的效率

前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。 正文 准备测试对象 下面先定义一个...

flower_517的博客 985

java反射和字节码的效率_详解提高使用Java反射的效率方法

详解提高使用Java反射的效率方法来源:中文源码网浏览: 次日期:2019年11月5日【下载文档:详解提高使用Java反射的效率方法.txt】(友情提示:右键点上行txt文档名->目标另存为)详解提高使用Java反射的效率方法在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又...

weixin_42394785的博客 205

反射 java 效率_如何提高使用Java反射的效率?

前言在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。正文准备测试对象下面先定义一个测试的类...

weixin_32999397的博客 111

java 类反射的效率_怎样提高使用Java反射的效率

在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少用。难道反射真的很慢?那跟我们平时正常创建对象调用方法比慢多少? 估计很多人都没去测试过,只是”道听途说“。下面我们就直接通过一些测试用例来直观的感受一下”反射“。正文准备测试对象下面先定义一个测试的类Te...

weixin_36032446的博客 111
上一篇: java写入文件的几种方法分享
下一篇: Java异常处理最佳实践及陷阱防范
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值