0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java反射和new效率对比,差距有多大?

jf_ro2CN3Fa 来源:CSDN 2022-12-22 14:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

  • 一. 基础概念
  • 二. new 对象和反射创建对象的效率对比
  • 三. 反射和new 的使用场景
cfc70a16-81b9-11ed-8abf-dac502259ad0.png

一. 基础概念

Java中,一般我们创建一个对象可能会选择new一下个实例。但是随着我们技术的不断提升,我们也学习到了,可以通过反射技术实现对象的创建。

可是,你有没有想一下,什么时候我们改用new创建对象,什么时候我们改用反射创建对象呢?

两者创建对象的效率又是如何呢?

//new方式创建对象
ReflectDemoreflectDemo=newReflectDemo();
//反射创建对象反射创建对象的三种方式
(1)ClassreflectDemoClass=ReflectDemo.class;
(2)ClassaClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)ClassaClass=reflectDemoClass.getClass();

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二. new 对象和反射创建对象的效率对比

//测试代码如下
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException{
proxyObject();
newObject();
}

//new创建对象
//5
publicstaticvoidnewObject(){
longstartTime=System.currentTimeMillis();
inti;
for(i=0;i< 100000000;i++){
ReflectDemoreflectDemo=newReflectDemo();
}
if(i==100000000){
longendTime=System.currentTimeMillis();
System.out.println("new耗时为:"+(endTime-startTime));
}
}

//反射创建对象
//30
publicstaticvoidproxyObject()throwsIllegalAccessException,InstantiationException{
longstartTime=System.currentTimeMillis();
ClassreflectDemoClass=ReflectDemo.class;
inti;
for(i=0;i< 100000000;i++){
ReflectDemoreflectDemo=reflectDemoClass.newInstance();
}
if(i==100000000){
longendTime=System.currentTimeMillis();
System.out.println("反射耗时为:"+(endTime-startTime));
}
}
}
cfd737d8-81b9-11ed-8abf-dac502259ad0.png

最终我们发现,new 100000000 个对象和反射创建 100000000 个对象,效率相差了很多倍。

所以下面我们来探讨一下为什么这么大差别?

首先第一点,一般我们的Java代码是需要编译后在虚拟机里面运行的。

我们一般都是通过一个前端编辑器,比如javac,把java文件转为class文件。

接下来,程序运行期间,可能会通过一个JIT,即时编译器将字节码文件转换为计算机认识的机器码文件。

另外一种可能是通过一个AOT编译器,直接把java文件编译为本地机器码文件。其中JIT在程序运行期会对程序进行优化,但是反射是通过动态解析的方式,因此可能无法执行某些java虚拟机的优化。

总结起来有下面几个原因:

Method#invoke 方法会对参数做封装和解封操作

  • 需要检查方法可见
  • 需要校验参数
  • 反射方法难以内联
  • JIT 无法优化

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

三. 反射和new 的使用场景

反射的部分使用场景

  1. Spring通过反射来帮我们实例化对象,并放入到Ioc容器中
  2. 使用JDBC链接数据库时加载数据库驱动Class.forName()
  3. 逆向代码 例如反编译
  4. 利用反射,在泛型为int的arryaList集合中存放一个String类型的对象

new 对象和反射的区别

  1. new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。
  2. new必须要知道类名,而反射创建对象不需要知道类型也可以创建

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    3006

    浏览量

    116828
  • 数据库
    +关注

    关注

    7

    文章

    4083

    浏览量

    68538
  • 编译器
    +关注

    关注

    1

    文章

    1672

    浏览量

    51907

原文标题:Java反射和new效率对比,差距有多大?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    反射内存卡的具体应用

    反射内存卡在各种场景下的具体应用
    的头像 发表于 04-20 16:42 121次阅读

    Java 开发者指南:全面对比传统 IDE AI 插件与 Cursor、Windsurf 等 AI 原生 IDE

    AI 正在以前所未有的速度重塑 Java 开发工作流。本文将为您深度解析 AI 在 Java 开发中的核心应用场景,并全面对比传统 IDE(如 IntelliJ IDEA、VS Code)的 AI
    的头像 发表于 03-26 14:36 573次阅读
    <b class='flag-5'>Java</b> 开发者指南:全面<b class='flag-5'>对比</b>传统 IDE AI 插件与 Cursor、Windsurf 等 AI 原生 IDE

    智能显示模块Flash存储空间多大?模块的内存有多大

    智能显示模块Flash存储空间多大?模块的内存有多大
    发表于 02-26 09:17

    DRAM缓存真有那么重要吗?天硕工业级SSD固态硬盘实测告诉你答案!

    在国产固态硬盘推荐榜中,推荐五花八门,很多用户疑惑DRAM 缓存 SSD 值得买吗?不同方案的国产 SSD 性能对比差距到底多大?价格差距
    的头像 发表于 01-19 16:49 444次阅读

    电池分容柜:“卷”出新高度,效率差距究竟有多大

    性直接影响电池生产效率与终端产品可靠性。 一、电池分容柜的核心定义:技术定位与核心功能 从技术本质来看,电池分容柜是一种集成充放电控制、参数检测、数据处理于一体的高精度电池性能测试设备,核心功能是通过模拟电池实际
    的头像 发表于 01-08 11:31 468次阅读

    HMC252A非反射式射频开关

    HMC252A非反射式射频开关HMC252A(ADI器件编号HMC252AQS24E)是一款基于 GaAs MMIC 工艺的 SP6T 非反射式射频开关,凭借其低插入损耗、高集成度及宽频
    发表于 12-09 09:23

    同是电流检测芯片FP137 与 INA139,实际性能差距多大

    在电机驱动的项目应用上,为了防止过载和堵转等异常情况的发生,往往都会实时检测风扇电机的工作电流。这样可以更好的控制、掌握电机的运行状态,保障电机的正常运行。 客户一个 无人机电调电机模块项目
    发表于 11-17 10:45

    Arm Neoverse CPU上大代码量Java应用的性能测试

    Java 虚拟机 (JVM) 内执行。JVM 必须先通过解释器或即时 (JIT) 编译器将字节码转换为机器码,而运行时生成的机器码对 Java 应用的效率和性能至关重要。
    的头像 发表于 11-05 11:25 936次阅读
    Arm Neoverse CPU上大代码量<b class='flag-5'>Java</b>应用的性能测试

    反射系数、回波损耗、电压驻波比之间的关系

    个参数。它表示反射波与入射波的比值,反映了当电磁波遇到不匹配的阻抗时,多少能量被反射回去。反射系数的计算公式涉及负载阻抗ZL和传输线阻抗Z0的比值。当负载阻抗与
    的头像 发表于 10-29 17:36 1523次阅读
    <b class='flag-5'>反射</b>系数、回波损耗、电压驻波比之间的关系

    椭偏仪选型指南 | 椭圆偏振法与反射法的优劣对比

    椭圆偏振法和反射法是用于表面分析和薄膜表征的光学测量技术。这两种方法都依赖于光反射:椭圆偏振法分析反射光偏振状态的变化,反射法则测量其强度。椭圆偏振法和
    的头像 发表于 09-15 18:02 960次阅读
    椭偏仪选型指南 | 椭圆偏振法与<b class='flag-5'>反射</b>法的优劣<b class='flag-5'>对比</b>

    Java效率提升指南:5个Java工具选型建议及Perforce JRebel和XRebel介绍

    企业级Java环境越来越复杂,真正的破局点,可能不在“人”,而在于“工具”。5个实用建议,帮你理清Java工具的选型思路。
    的头像 发表于 09-11 13:59 1889次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>效率</b>提升指南:5个<b class='flag-5'>Java</b>工具选型建议及Perforce JRebel和XRebel介绍

    0.04% vs 0.1%:精度差一点,逆变器性能差距多大

    本文导读一台光伏逆变器损失的功率可能仅仅源于0.3%的MPPT效率差距。这个足以影响产品竞争力的数字,可能并非算法优劣,而在于测试源头的精度选择:是0.04%还是0.1%?本文通过四大测试场景的量化
    的头像 发表于 08-20 11:32 1847次阅读
    0.04% vs 0.1%:精度差一点,逆变器性能<b class='flag-5'>差距</b><b class='flag-5'>有</b><b class='flag-5'>多大</b>?

    LED芯片电极中的铝反射层被含氯胶水腐蚀现象触目惊心!

    出于亮度和成本考虑,越来越多的芯片厂采用铝反射层的金电极。新结构的LED芯片电极中有一层铝,其作用为在电极中形成一层反射镜以提高芯片出光效率,其次可在一定程度上减少蒸镀电极时黄金的使用量从而
    的头像 发表于 06-16 15:08 1865次阅读
    LED芯片电极中的铝<b class='flag-5'>反射</b>层被含氯胶水腐蚀现象触目惊心!

    超声波除油清洗设备的清洗范围多大

    清洗设备的清洗范围多大,接下来,我们将详细解答这个问题。一、超声波除油清洗设备的清洗方式超声波清洗是应用于清洗工艺的一种新技术,利用高频振荡产生的空泡和爆炸作用原
    的头像 发表于 05-14 17:30 802次阅读
    超声波除油清洗设备的清洗范围<b class='flag-5'>有</b><b class='flag-5'>多大</b>?

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让开发者即时看到代码更改的效果,从而缩短开发、调
    的头像 发表于 04-27 13:44 976次阅读
    <b class='flag-5'>Java</b>开发者必备的<b class='flag-5'>效率</b>工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b>开发者在用?