提高java反射效率

1、在系统启动阶段使用反射。
2、将反射得到元数据保存起来,使用时,只需从内存中调用即可。
3、hotspot虚拟机会对执行次数较多的方法进行优化(例如使用jit技术)。
4、使用高性能的反射库,应该会比自己写缓存效果好。

准备测试对象

下面先定义一个测试的类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

其实通过代码我们可以发现,是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)的方式可以关闭安全检查,从而提升反射效率。

极致的反射

除了上面的手段,还有没有什么办法可以更极致的使用反射呢?这里介绍一个高性能反射工具包ReflectASM。它是通过字节码生成的方式来实现的反射机制,下面是一个跟java反射的性能比较。

怎么提高Java中反射的效率

关于怎么提高Java中反射的效率就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/5550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络编程socket(下)

目录 一、TCP网络程序 1.1 服务端初始化 1.1.1 创建套接字 1.1.2 服务端绑定 1.1.3 服务端监听 1.2 服务端启动 1.2.1 服务端获取连接 1.2.2 服务端处理请求 1.3 客户端初始化 1.4 客户端启动 1.4.1 发起连接 1.4.2 发起请求 1.5 网络测试 1.6 单执行流服务端的…

非科班应届生培训Java能就业吗?

想要学习Java开发的同学们&#xff0c;不要再太过纠结非科班可以学Java吗&#xff1f;学历低能学Java开发吗?Java开发怎么才能学得好?没有计算机基础能学习Java开发吗&#xff1f;这些问题了。想的再多都不如行动&#xff0c;大胆努力认真踏实地学习就好。谁不是一步步来的呢…

GPT-4老板:AI可能会杀死人类,已经出现我们无法解释的推理能力

来源: 量子位 微信号&#xff1a;QbitAI “AI确实可能杀死人类。” 这话并非危言耸听&#xff0c;而是OpenAI CEO奥特曼的最新观点。 而这番观点&#xff0c;是奥特曼在与MIT研究科学家Lex Fridman长达2小时的对话中透露。 不仅如此&#xff0c;奥特曼谈及了近期围绕ChatGPT…

如何同时处理多个聊天

作为跨境电商企业&#xff0c;有没有想过您的客服成员同时处理多个聊天有多大挑战&#xff1f;如果他们在管理多个聊天时犯了错误&#xff0c;或者他们的一个响应提示访问者在获得解决方案之前离开网站怎么办&#xff1f; 是的&#xff0c;毫无疑问&#xff0c;最好的实时支持聊…

微服务_微服务的架构演进之路

目录 一、前言 二、单体架构 三、分布式架构 四、微服务 五、SpringCloud 六、服务拆分 5.1服务拆分原则 5.2服务拆分示例 一、前言 微服务是一种软件开发架构风格&#xff0c;它将单个应用程序拆分成多个小型服务&#xff0c;每个服务都具有自己的特定功能。这些服务…

【开发实践】在线考试系统(三) Sortable实现试题的重排序

一、需求分析 开发一个在线考试系统&#xff0c;在教师组卷功能模块中&#xff0c;需要对已经选择的试题进行重排序&#xff0c;获得所需试题顺序的试卷。 如下是试卷编辑页面&#xff0c;需要在将已经选中的试题重排顺序。 二、技术引入 1、sortable.js sortable.js 官方…

太敢说了,编程如果这么自学,培训班都得倒闭,直接省去上万元的学费

写了20多年的代码&#xff0c;之前做过阿里的高级架构师&#xff0c;在技术这条路上跌跌撞撞了很多&#xff0c;我今天分享一些我个人的自学方法给各位。现在在网上报个正经点的班得花几千块钱&#xff0c;线下就更夸张&#xff0c;都是万元起步,我的这些学习方法如果你能用好&…

【iOS】—— 多线程之pthread、NSThread

文章目录1.pthreadpthread简介&#xff1a;pthread使用方法pthread 其他相关方法2.NSThread创建&#xff0c;启动线程线程相关用法线程相关用法线程状态控制方法线程之间的通信NSThread线程安全和线程同步NSThread 非线程安全NSThread 线程安全线程的状态转换NSThread线程属性n…

GPT-4问世;LLM训练指南;纯浏览器跑Stable Diffusion

1.多模态GPT-4正式发布&#xff1a;支持图像和文本输入&#xff0c;效果超越ChatGPT OpenAI的里程碑之作GPT-4终于发布&#xff0c;这是一个多模态大模型&#xff08;接受图像和文本输入&#xff0c;生成文本&#xff09;。主要能力有&#xff1a; GPT-4可以更准确地解决难题&a…

基于SpringBoot的校园疫情防控系统设计与实现

1.概述 校园疫情防控系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了校园疫情防控管理的信息化&#xff0c;使用户体验到校园疫情防控管理&#xff0c;管理员管理操作将更加方…

2023.04.02 学习周报

文章目录摘要文献阅读1.题目2.摘要3.简介4.本文贡献5.PROBLEM FORMULATION5.1 Case Study5.2 Problem Definition6.MODEL6.1 Absolute Temporal Module6.2 Relative Temporal Module6.3 Decoder Module6.4 Loss Function7.实验7.1 数据集7.2 评价指标7.3 基线7.4 实验结果8.结论…

R语言数据处理学习记录--用自己的数据完成mental test(使用ggcor包)

R语言数据处理学习记录–用自己的数据完成mental test&#xff08;使用ggcor包&#xff09; 注&#xff1a;本文仅作为自己的学习记录以备复习查阅 关于科学上网&#xff1a;https://www.zhihu.com/question/498939985 一 ggcor包的简介及其安装 ggcor的目标是提供一组可以…

【Nvidia】nvidia 高级特性MIG详细介绍(二)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

seaborn从入门到精通03-绘图功能实现03-分布绘图distributional plots

seaborn从入门到精通03-绘图功能实现03-分布绘图distributional plots总结参考关系-分布-分类分布绘图-Visualizing distributions data图形级接口displot/jointplot/pairplot--figure-level interface轴级接口histplot/kdeplot/ecdfplot/rugplot--axes-level interface导入库与…

C++/MFC工程[4]——绘制直线段

一、MoveTo()函数和LineTo()函数 本文实例均于 ***View().cpp文件中的OnDraw()函数中实现。 两函数在上上节C/MFC工程[2]——自定义平面直角坐标系中已经有所应用。 MoveTo()函数只设置起点&#xff0c;不画线。 LineTo()函数进行画线&#xff0c;画线结束后&#xff0c;起点变…

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …

软考-软件测试

一.测试概述经典定义在规定的条件下对程序进行操作&#xff0c;已发现错误&#xff0c;对软件质量进行评估对象程序&#xff0c;文档&#xff0c;数据目的发现软件的错误&#xff0c;验证软件是否满足用户需求&#xff0c;并通过分析软件错误产生原因&#xff0c;以帮助开发工作…

蓝桥杯C/C++VIP试题每日一练之完美的代价

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

别把 OpenAI 太当回事,它远未达到替换前端的地步

最近几个月&#xff0c;我和很多初入行的开发人员交谈&#xff0c;他们对AI越来越感到焦虑。他们看到像GPT-4这样的工具展示的越来越令人印象深刻的演示&#xff0c;担心等他们掌握了HTML/CSS/JS&#xff0c;就没有任何工作机会了。这种情绪现在在Twitter上广泛存在&#xff1a…

锐捷AP虚拟化配置

本次使用AC型号为WS6008 &#xff0c; 版本AC RGOS 11.9(6)W2B1 Release(10142114) 使用的AP型号为AP720-I &#xff0c;版本为AP RGOS 11.1(9)B1P30, Release(08190211) 升级主要参考指南闪电兔Pro 组网拓扑&#xff1a; 主要配置&#xff1a; 当前状态是AC已经能够管理AP …
最新文章