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

    文章

    2997

    浏览量

    115640
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67718
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51073

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

    企业级Java环境越来越复杂,真正的破局点,可能不在“人”,而在于“工具”。5个实用建议,帮你理清Java工具的选型思路。
    的头像 发表于 09-11 13:59 893次阅读
    <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 1395次阅读
    0.04% vs 0.1%:精度差一点,逆变器性能<b class='flag-5'>差距</b><b class='flag-5'>有</b><b class='flag-5'>多大</b>?

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

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

    VirtualLab Fusion应用:具有粗糙表面的回复反射器的反射

    系统设置 当试图将独立于入射方向的光大致反射回同一方向时,通常可以使用回复反射器。 这个演示展示了如何在非序列场追迹的帮助下对这种结构进行建模。它还包括通过在表面上应用随机函数来对反射器壁的粗糙表面进行建模。 任务描述 系统
    发表于 04-02 08:49

    DMD怎么做反射镜?

    购买了DMD,但是怎么把他作为反射镜?提供的资料都是电脑端口直接送入图片,而不是反射镜的作用
    发表于 03-03 07:31

    请问DLP5530S-Q1反射率多少?

    请问DMD的反射效率是多少? DMD反射的光通量/入射到DMD有效面积上的光通量 下文只写了 window transmission (2 passes),请问diffraction
    发表于 02-19 07:11

    时域反射计的技术原理和应用场景

    位置及其阻抗值。反射信号的幅度和特性与传输线的阻抗密切相关。应用场景时域反射计在多个领域广泛的应用,具体包括: 电气工程与通信:用于检测通信电缆和金属电缆(如双绞线、同轴电缆)中的断点位置、连接器位置
    发表于 02-11 14:39

    DAC3164内部的FIFO多大,需要多少个dataclk后需reset?

    你好,在看DAC3164 的datasheet 时,遇到个问题。SYNC P/N 用来resetDAC内部的FIFO。我想问的是,该DAC内部的FIFO多大,需要多少个dataclk后需reset? 谢谢~
    发表于 01-22 08:22

    国产芯片差距还有多大

    芯片
    芯广场
    发布于 :2025年01月15日 17:45:07

    光的全反射

    一般来说,当光在两种不同的透明材料之间移动时,有些光会被折射,有些会被反射。全内反射是一种光学现象,其中从较高折射率区域传播到较低折射率区域的光线在边界处被完全反射。   考虑入射角逐渐增大时会
    的头像 发表于 01-14 10:39 1916次阅读
    光的全<b class='flag-5'>反射</b>

    反射光束整形系统

    。 规格:像散激光光束 由激光二极管发出的强像散高斯光束 忽略发射区域在x和y方向可能发生的移动 规格:柱形抛物面反射镜 抛物面曲率的圆柱镜 应用用锥形常数.-1来实现锥形界面 曲率半径等于
    发表于 12-12 10:38

    ADC128S102WGRQV想知道输入阻抗具体多大

    ADC128S102WGRQV想知道输入阻抗具体多大?多少KOhms?要计算用,谢谢!我已经看过7.3.3章节。
    发表于 12-06 08:33