您现在的位置是:首页 > 正文

为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?...

2024-04-01 00:57:43阅读 1

说起Java的反射机制,大家应该不陌生吧,她是Java语言多态的一种体现。但是在面试过程中,我发现很多人都只是停留在听说过的层面,并没有知其所以然,今天我们就来探讨下。

f22364cedb96771acb34cfe4e4684b72.png

大部分人最早接触的反射代码,是JDBC的那一行Class.forName代码。为什么我们在实际的Java项目中很少用到反射,因为框架都帮我们做掉啦,像Spring、Mybatis、Druid等主流框架,无一离不开反射机制。

e4f7cc5737e27f01b423187a23d00603.png

一、反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取类信息以及动态调用对象内容就称为Java语言的反射机制。

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。

cd703733e87fe6dce360c085e73660c4.png

二、反射的实现

要使用一个类,就要先把它加载到虚拟机中,生成一个Class对象。这个Class对象就保存了这个类的一切信息。反射机制的实现,就是获取这个Class对象,通过Class对象去访问类、对象的元数据以及运行时的数据。

89b2bc7f883681bbf23475a26249192d.png

1、获取Class对象的三种方式

  • 使用 Class 类中的 forName()静态方法
  • 调用某个对象的 getClass()方法(需要new对象)
  • 调用某个类的 class 属性来获取该类对应的 Class 对象

2、创建Class对象的两种方法

  • Class 对象的 newInstance()。使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。
  • 调用 Constructor 对象的 newInstance()。先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。
cda4efc354ce30c9e21a552ea9f21241.png

三、关于反射机制的几点思考

Java中为什么要用反射机制?直接创建对象不就可以了吗,我觉得这主要涉及到了动态与静态的问题。

  • 静态编译:在编译时确定类型,绑定对象,即通过。
  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的耦合性。
ee343ab5256d6226c64a5217897b8878.png

从实际的编程使用来看,我对反射机制有几点思考,分享给大家。个人觉得,反射机制的优势很明显:她可以实现动态创建对象和编译,体现出语言很大的灵活性,这也是反射被广泛用于各种框架中的最主要原因。

但是反射机制的缺点也是显而易见的:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作,同时在运行时动态编译也会比较消耗内存

网站文章

  • RESTful 规范

    1. 基本概念     REST全称是Representational State Transfer,中文意思是表征性状态转移。指的是一组架构约束条件和原则。如果一个架构符合REST的约束条件和原则,...

    2024-04-01 00:57:17
  • Python中运算符优先级的顺序

    Python中运算符优先级的顺序

    目录(一)引言(二)运算符分类(三)关于三种运算符的优先级列表 在任何语言中运算符都有优先级一说,那在Python中我们常见的运算符优先级又是如何呢,本文我将展开聊聊这个话题 此处我将列出常见运算符,大致分为算数符(比如加减乘除),关系符(比如大于小于等于)以及逻辑符(与非或)......

    2024-04-01 00:57:08
  • 零宽度字符隐写(CTF) 热门推荐

    零宽度字符隐写(CTF) 热门推荐

    文章目录零宽度字符简介用法其他用法例题:[UTCTF2020] zero 零宽度字符简介 零宽度字符是一些不可见的,不可打印的字符。它们存在于页面中主要用于调整字符的显示格式。 常见的零宽度字符及它们...

    2024-04-01 00:57:02
  • 延迟绑定与ret2dlresolve

    延迟绑定与ret2dlresolve

    2024-04-01 00:56:38
  • Java Junit 由浅入深

    Java Junit 由浅入深

    JUnit4的常用方法:fail()方法:是指测试失败assertEquals()方法:测试2个参数(一个是预期值,一个是实际值)是否相等1. @Test : 测试方法,测试程序会运行的方法,后边可以跟参数代表不同的测试,如(expected=XXException.class) 异常测试,(timeout=xxx)超时测试2. @Ignore : 被忽略的测试方法3. @Befo...

    2024-04-01 00:56:31
  • stm32延时函数的三种写法 热门推荐

    我常用的延时函数有3种,一种是空循环,一种是使用systick中断,还有一种是正点原子的延时。 第一种就不做举例,因为平时不常用。但是一些模块给的参考代码的延时函数都会采用这样的方法,直接用就好了,不...

    2024-04-01 00:56:25
  • 在cmd中查询mysql数据库中文显示为“ ?”的解决办法

    在cmd中查询mysql数据库中文显示为“ ?”的解决办法

    解决命令提示符中查询mysql中文显示为问号的方法 今天在使用Navicat给mysql建表的时候输入了一些包含中文的数据,然后想在cmd中操作一下,查询的时候发现中文字段都变成了问号??? 之后我看了一下Navicat中编码方式为UTF-8,而cmd默认编码格式是GBK, 所以只需要在cmd中加上set names gbk; 就能解决了。 ...

    2024-04-01 00:56:00
  • springcloud——客户端Eureka Client实现负载均衡 Ribbon

    springcloud——客户端Eureka Client实现负载均衡 Ribbon

    一、简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均...

    2024-04-01 00:55:54
  • 引用和指针那些事

    对一个数据建立一个“引用”,其作用是为一个已经定义的变量起一个别名【1】引用的格式 类型& 引用的变量名(别名)=定义过的变量名 比如有一个变量a,想给他起一个别名:int a=10; //定义一个变量aint& b=a; //声明b是a的引用cout<<a<<endl; //10cout<<b&...

    2024-04-01 00:55:48
  • 万事开头难? 喵小DI玩“羊了个羊”可不难

    万事开头难? 喵小DI玩“羊了个羊”可不难

    DI-sheep 版 羊了个羊

    2024-04-01 00:55:42