您的位置 首页 java

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

一. 基础概念

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

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

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

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

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

 //测试代码如下
public class ReflectDemo {
 public  static   void  main (String[] args) throws IllegalAccess Exception , 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));
  }
 }
}
  

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

最终我们发现, 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必须要知道类名,而反射创建对象不需要知道类型也可以创建

文章来源:智云一二三科技

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

文章地址:https://www.zhihuclub.com/179139.shtml

关于作者: 智云科技

热门文章

网站地图