简单记录一下这个面试题,确实在每天的开发中,每次都是手动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容器去要就行了。
至于为什么需要反射呢,这就是我们平时接触不到的了,平时我们都是为了实现某个需求,都是去写的业务逻辑,解决的是一部分代码的问题,而反射解决的是系统软件的通用性问题,这就是框架的魅力。