0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java反射技术实现对象的创建

Android编程精选 来源:Android编程精选 2023-05-22 14:25 次阅读

一. 基础概念

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

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

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

//new方式创建对象
ReflectDemoreflectDemo=newReflectDemo();
//反射创建对象反射创建对象的三种方式
(1)ClassreflectDemoClass=ReflectDemo.class;
(2)ClassaClass=Class.forName("com.whale.springtransaction.transactiondemo.reflectdemo.ReflectDemo");
(3)ClassaClass=reflectDemoClass.getClass();

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

//测试代码如下
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsIllegalAccessException,InstantiationException{
proxyObject();
newObject();
}

//new创建对象
//5
publicstaticvoidnewObject(){
longstartTime=System.currentTimeMillis();
inti;
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 ();
  ClassreflectDemoClass=ReflectDemo.class;
inti;
for(i=0;i< 100000000; i++) {
   ReflectDemo reflectDemo = reflectDemoClass.newInstance ();
  }
  if (i == 100000000) {
   long endTime = System.currentTimeMillis ();
   System.out.println ("反射耗时为:" + (endTime - startTime));
  }
 }
}
6000b410-f771-11ed-90ce-dac502259ad0.png

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

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

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

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

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

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

总结起来有下面几个原因:

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

需要检查方法可见

需要校验参数

反射方法难以内联

JIT 无法优化

三. 反射和new 的使用场景

反射的部分使用场景

Spring通过反射来帮我们实例化对象,并放入到Ioc容器中

使用JDBC链接数据库时加载数据库驱动Class.forName()

逆向代码 例如反编译

利用反射,在泛型为int的arryaList集合中存放一个String类型的对象

new 对象和反射的区别

new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。

new必须要知道类名,而反射创建对象不需要知道类型也可以创建

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103004
  • 编辑器
    +关注

    关注

    1

    文章

    788

    浏览量

    30254
  • 反射技术
    +关注

    关注

    0

    文章

    5

    浏览量

    5953

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

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用java映射创建java对象和调用java对象

    java是一种解析语言,java程序是通过java虚拟机解析.class的方式运行起来。因此,java中就存在java映射的概念。下面介绍如
    发表于 04-11 14:43

    如何用java映射创建java对象和调用java对象的方法

    Method对象的invoke方法。好,现在上代码:lolpackage com.bunchen.test;import java.lang.reflect.Constructor;import
    发表于 07-28 16:11

    JAVA语言与面向对象程序设计课件

    JAVA语言与面向对象程序设计课件:第1章  Java和面向对象概述.ppt第2章  Java概述.ppt第3章&nbs
    发表于 12-06 13:52 43次下载

    Java对象的生命周期

    本章内容 4.1 对象的声明与创建4.1.1 基本术语4.1.2 对象的声明4.1.3 对象创建4.1.4 数组
    发表于 04-10 15:49 0次下载

    JAVA教程之存储与读取对象

    JAVA教程之存储与读取对象,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 7次下载

    基于Java反射机制的Excel文件导出实现_杨敏煜

    基于Java反射机制的Excel文件导出实现_杨敏煜
    发表于 03-18 09:46 1次下载

    java如何创建对象的分析

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多
    发表于 09-27 14:36 0次下载

    实例分析Java创建对象

    Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 Paste_Image.png 如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建
    发表于 09-28 13:29 0次下载

    java学习——java中的反射学习笔记

    本文档内容介绍了java学习java中的反射学习笔记,供参考
    发表于 03-13 14:19 0次下载

    Java教程之零点起飞学Java的类与对象资料说明

    类与对象是进行面向对象编程的基础。类是具有相同属性特征和行为规则的多个对象的一种统一描述,对象是对类的实例化。在Java语言中,类是一种最基
    发表于 02-20 10:41 14次下载
    <b class='flag-5'>Java</b>教程之零点起飞学<b class='flag-5'>Java</b>的类与<b class='flag-5'>对象</b>资料说明

    Java反射机制到底是什么?有什么作用

    Java反射机制是 Java 语言的一个重要特性,它在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法。此外,在 ORM 中间件
    的头像 发表于 02-15 14:07 4642次阅读

    Java实验:类和对象的扩展

    Java实验:类和对象的扩展
    发表于 07-08 15:36 20次下载
    <b class='flag-5'>Java</b>实验:类和<b class='flag-5'>对象</b>的扩展

    详解Java基础知识点反射

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为
    的头像 发表于 04-09 13:47 1752次阅读
    详解<b class='flag-5'>Java</b>基础知识点<b class='flag-5'>反射</b>

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

    Java中,一般我们创建一个对象可能会选择new一下个实例。但是随着我们技术的不断提升,我们也学习到了,可以通过反射
    的头像 发表于 12-22 14:50 885次阅读

    Java创建对象有哪些方式

    1 问题 作为Java开发者,经常创建很多对象,你是否知道Java创建对象有哪些方式呢?
    的头像 发表于 02-24 10:29 859次阅读