(每日一题)创建对象反射和new效率差

文章讨论了Java中通过反射创建对象与直接使用new关键字的效率差异,指出反射相对较慢,但解释了为何在Spring等框架中仍然使用反射,因为反射增加了代码的灵活性和通用性,实现了IOC和DI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单记录一下这个面试题,确实在每天的开发中,每次都是手动new对象,没有真正了解过bean容器通过反射的方式为我,创建对象。

简单建一个类

package com.demo.entity;

public class Person {
}

new 创建对象效率

@Test
    public void test1(){
        //获取执行前的时间
        final long l = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            Person person = new Person();
        }
        final long l1 = System.currentTimeMillis();
        System.out.println(l1-l);
    }

输出结果为3

说明new 对象是非常快的

接下来试一下通过反射的方式创建对象

通过反射创建对象,首先得要获取类

获取类的三种方式

1.Class.forName方式通过静态方法

2.通过类名.class

3.通过对象引用.gerClass方法

这里我选择我平时用的比较多的Class.forName

final long l2 = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            Class aClass = Class.forName("com.demo.entity.Person");
            Person o = (Person) aClass.newInstance();
        }
        final long l3 = System.currentTimeMillis();
        System.out.println(l3-l2);

输出是5127

效率很明显比new 要慢很多

为什么反射会比new慢这么多呢?

首先new 这是一个指令 系统接到这人命令,立马就是申请内存空间(堆空间,接下来就是调用无参构造,来初始化等一系列操作,因为你new明确的指定了是哪个类需要创建,而反射不同,他的先去你在某个包下类,找到了之后还要做解析,看看类里有什么东西,再去找构造方法,找到了还去执行这个方法,底层应该是通过一个角invoke的方法,接下来就是开辟内存空间,加载,初始化等,这能不慢嘛.

那有人会说了,既然反射这么慢,为什么很多框架还会用呢,既然这么慢,性能这么差,我们为什么不用它呢,都用new就好了,首先我们spring底层框架,会对一些对象做管理,我们都知道spring的IOC+DI

IOC是控制反转,也就是,我们的很多对象都交由spring容器去管理创建,也就是我们说的控制反转,我们需要这个对象的时候,只需要问spring容器去要就行了。

至于为什么需要反射呢,这就是我们平时接触不到的了,平时我们都是为了实现某个需求,都是去写的业务逻辑,解决的是一部分代码的问题,而反射解决的是系统软件的通用性问题,这就是框架的魅力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值