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

news2024/11/27 18:43:07

文章目录

  • 一、基础概念
  • 二、new 对象和反射创建对象的效率对比
    • 所以下面我们来探讨一下为什么这么大差别?
    • 总结起来有下面几个原因
  • 三、反射和new 的使用场景
    • 反射的部分使用场景
    • new对象和反射的区别


一、基础概念

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

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

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

//new 方式创建对象
ReflectDemo reflectDemo = new ReflectDemo();
//反射创建对象  反射创建对象的三种方式
(1)Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
(2)Class<?> aClass = Class.forName ("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)Class<? extends Class> aClass = reflectDemoClass.getClass ();

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

//测试代码如下
public class ReflectDemo {
    public static void main (String[] args) throws IllegalAccessException, InstantiationException {
        proxyObject();
        newObject();
    }

    //new 创建对象
    //5
    public static void newObject(){
        long startTime = System.currentTimeMillis ();
        int i;
        for (i = 0; i < 100000000; i++) {
            ReflectDemo reflectDemo = new ReflectDemo ();
        }
        if (i == 100000000) {
            long endTime = System.currentTimeMillis ();
            System.out.println ("new耗时为:" + (endTime - startTime));
        }
    }

    //反射 创建对象
    //30
    public static void proxyObject() throws IllegalAccessException, InstantiationException {
        long startTime = System.currentTimeMillis ();
        Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
        int i;
        for (i = 0; i < 100000000; i++) {
            ReflectDemo reflectDemo = reflectDemoClass.newInstance ();
        }
        if (i == 100000000) {
            long endTime = System.currentTimeMillis ();
            System.out.println ("反射耗时为:" + (endTime - startTime));
        }
    }
}

在这里插入图片描述

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

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

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

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

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

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

总结起来有下面几个原因

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

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

三、反射和new 的使用场景

反射的部分使用场景

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

new对象和反射的区别

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回顾vmware 补充细节

安装好esxi后怎么直接在DCUI界面&#xff08;直接控制台用户界面&#xff09;进入命令行页面 在该界面使用 ALT F1 进入 ALT 退出 I界面&#xff08;直接控制台用户界面&#xff09;用户需要在机房直连服务器上才可以看到该界面 VSphere 在老的CPU是不支持的 三种方式访…

调试神器--Rlog

概述 在现代软件开发中&#xff0c;日志记录系统是不可或缺的一部分。它不仅可以帮助开发人员在应用程序中定位和解决问题&#xff0c;还可以用于监控、性能分析、安全审计等方面。本文将介绍日志记录系统的基本概念、重要性以及如何构建一个高效的日志记录系统。 为什么需要…

AI时代Excel数据分析提升之道

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

Oculus经验记录

它的Unity插件以前的版本V39跟V40有问题。V40最奇葩&#xff0c;inputOVR组件中几乎什么都没有&#xff0c;V39还好&#xff0c;只是OVRcameraRG无法拖动倒inputOVR组件上&#xff0c;因类型差一点点&#xff08;这个我记得以前自己遇到过&#xff0c;有解决的记录&#xff0c;…

洗眼镜超声波清洗机品牌哪个值得买?眼镜超声波清洗机推荐

现在大部分人都离不开眼镜来辅助我们看远处的东西&#xff0c;不单单是眼镜&#xff0c;现在墨镜的使用量也很大&#xff0c;墨镜可以再太阳大的时候遮挡一下视线&#xff0c;近视眼镜可以辅助那些有近视眼的朋友看到更远处的地方。随着眼镜使用量越来越大&#xff0c;也有很多…

WSL Ubuntu 22.04.2 LTS 安装paddlepaddle-gpu==2.5.1踩坑日记

环境是wsl的conda环境。 使用conda安装paddlepaddle-gpu: conda install paddlepaddle-gpu2.5.1 cudatoolkit11.7 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge 等待安装... 报错处理&#xff1a; (1)PreconditionNotMetError: Cannot lo…

虹科分享 | 2023Gartner®终端安全发展规律周期:AMTD引领未来

导语&#xff1a;在2023年Gartner终端安全发展规律周期中&#xff0c;自动移动目标防御&#xff08;AMTD&#xff09;崭露头角&#xff0c;虹科Morphisec被誉为AMTD领域的样本供应商。该周期呈现出终端安全领域的最新创新&#xff0c;旨在帮助安全领导者更好地规划、采纳和实施…

我与COSCon的故事【时光的故事】

曾经 2019年的时候&#xff0c;我还在日本读研究生&#xff0c;做一些物联网 (Internet of Things, IoT) 网络中的底层P2P (Peer to Peer) 通讯仿真模拟。这个方向是新来的Nguyen老师的新方向&#xff0c;它跟计算机强相关&#xff0c;但是很小众&#xff0c;实验室里也没有前辈…

汽车数据安全事件频发,用户如何保护隐私信息?

面对日益增多的汽车数据安全事件&#xff0c;对于广大用户来说&#xff0c;有没有既廉价又安全的解决方案&#xff1f; 频发的汽车数据安全事件 随着汽车“新四化”大潮的来临&#xff0c;汽车用户从电动化、网联化、智能化、共享化中切实体验到了越来越多的便利&#xff0c;各…

spark stream入门案例:netcat准实时处理wordCount(scala 编程)

目录 案例需求 代码 结果 解析 案例需求&#xff1a; 使用netcat工具向9999端口不断的发送数据&#xff0c;通过SparkStreaming读取端口数据并统计不同单词出现的次数 -- 1. Spark从socket中获取数据&#xff1a;一行一行的获取 -- 2. Driver程序执行时&#xff0c…

用CRM系统实现销售目标的步骤

每个销售都要有自己的目标计划&#xff0c;在定销售计划时要把握方面问题&#xff0c;一个严格执行&#xff0c;另一个是可控。明确销售目标后&#xff0c;合理分配时间&#xff0c;运用销售基本工作方法严格把控销售进度。那我们该如何用CRM销售管理系统实现销售目标&#xff…

js面向对象(工厂模式、构造函数模式、原型模式、原型和原型链)

1.封装 2. 工厂模式 function createCar(color, style){let obj new Object();obj.color color;obj.style style;return obj;}var car1 createCar("red","car1");var car2 createCar("green","car2"); 3. 构造函数模式 // 创建…

Mybatis-Plus3.x的使用

MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为 简化开发、提高效率而生。 一、引入 创建步骤&#xff1a; 1.创建Spring Boot工程 2.添加依赖 引入 Spring Boot Starter 父工程&am…

小程序开发平台源码系统+内容付费小程序功能 带完整的搭建教程

来喽来喽&#xff01;今天来给大家分享的是一款小程序开发平台源码系统&#xff0c;这款小程序开发平台的功能很多&#xff0c;本文主要给大家介绍一下内容付费小程序功能。以下是部分核心代码&#xff1a; 系统主要功能如下&#xff1a; 知识付费系统开发的优势。一是提高获取…

《永远的爱犬》The forever dog英文版

爱狗人士必读经典&#xff0c;主页左下角有英文版下载方式 手机可阅读

C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before)

数值极限 std::numeric_limits 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits&l…

ESD静电电压监控系统的作用是什么

ESD静电电压监控系统的作用是实时监测生产环境中的静电电压&#xff0c;及时检测和预防ESD静电电压过高的情况&#xff0c;保护设备和产品的质量&#xff0c;确保生产过程的安全和稳定。 具体来说&#xff0c;ESD静电电压监控系统可以实现以下功能&#xff1a; 实时监测静电电压…

华为云应用中间件DCS系列—Redis实现(社交APP)实时评论

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;应用中间件系列之Redis实现&#xff08;社交APP&#xff09;实时评论 1 什么是DEVKIT 华为云开发者插件&#xff08;Huawei Cloud Toolkit&#xff09;&#xff0…

[科研琐事] 安装服务器的二三事

1. 机柜参数 宽度&#xff1a;一般机器都是符合的&#xff1b; 深度&#xff1a;对应服务器最长的那个边&#xff1b; 厚度&#xff08;高度&#xff09;&#xff1a;1/2/3/4U&#xff0c;就是机柜上写的刻度数字&#xff0c;1U1.75英寸。 1U4.45cm 2U4.45cm * 2 3U4.45cm * …

揭秘OLED透明拼接屏的参数规格:分辨率、亮度与透明度全解析

作为一种新型的显示技术&#xff0c;OLED透明拼接屏在市场中正在迅速崭露头角&#xff0c;有很多知名品牌厂家能设计、开发、生产高品质的显示产品。 如尼伽、起鸿、康视界、LG、YCTIMES、腾裕等&#xff0c;这些品牌在显示技术领域拥有丰富的经验和声誉&#xff0c;以其卓越的…