了解并学会使用反射

目录

一、反射的应用场景(简单了解)

二、反射的定义

三、关于反射的四个重要的类

四、反射的使用

1.Class获取一个class对象的方式

方式一:forName():

方式二:封装类.Class:

方式三:对象.getClass:

三种方式的使用场景

2.Constructor获取类的构造方法

3.Field获取类的字段(成员变量)

4.Method获取类的成员方法


一、反射的应用场景(简单了解)

在刚学习java时,或者还没有进行实际的项目开发时,反射运用的情况相对较少。

不过也是必须掌握的知识点,而且它也并不难。

学完之后,要运用时,回来复习复习,就差不多了。

反射的主要用途有:

1. 在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法 。

2. 反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无 论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的 就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。


二、反射的定义

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

他就相当于一个魔镜,在运行状态下,给他照一个类,就能在镜子中看到他所有的内容,包括private修饰的字段、方法等。

这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。

看定义有点复杂,但是说了这么多,反射实际上就是:

可以获取一个封装类中的任何字段、构造方法、成员方法的一个机制。

如图(*/ω\*):


三、关于反射的四个重要的类

要想使用反射需要铺垫很多东西,才能懂,要使用反射,掌握这些知识是必要的,先不急,慢慢来。

简单看看下面的这四个类,这类四中的有很多关于反射的成员方法,等一下会介绍的奥,留有印象就行。


四、反射的使用

,使用反射获取Student类的属性和方法为例

一下是Student类的定义:

package Test1;/*** Created with IntelliJ IDEA* Description:* User:34398* Date:2024-05-04* Time:10:33*/
public class Student {public String Happy;private String name;private int age;private Student(String happy) {//私有的有参数构造方法this.Happy = happy;}public Student() {}//无参构造方法public Student(String name, int age) {//有参构造方法this.name = name;this.age = age;}private String setHappys(String happy){//私有含参数,成员方法this.Happy=happy;System.out.println("爱好:"+this.Happy);
return happy;}private void printfName() {//私有成员方法System.out.println("名字:" + this.name);}public void printfAge() {//公有成员方法System.out.println("年龄:" + this.age);}//一下是获取字段的方法public String getHappy() {return Happy;}public void setHappy(String happy) {Happy = happy;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {//重写一下toStringreturn "Student{" +"Happy='" + Happy + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

1.Class获取一个class对象的方式

获取一个class对象的方式有三种。

方式一:forName():

代码中的clazz1就是我们获取到的class对象了。

值得注意的是:

forName()中的全类名,不需要自己写,因为有时候路径名很长,自己写容易错。

我们可以用idea进行拷贝。

具体做法:

打开idea,右键Student类,选择Copy Path/Reference,点击:

然后进入这个界面,在点击Copy Reference,粘贴到forName()的参数列表中即可:

方式二:封装类.Class:

此时,clazz2也是Student的class对象。

方式三:对象.getClass:

注意,class对象只会存在一个,不会创建多个!

上述代码中的clazz1/clazz2/clazz3实际上指向的都是一个class对象:

三种方式的使用场景

第一种方式用的最多,一般都用forName()

第二种方式,一般当做一个参数进行传递        

第三种方式,在有封装类的对象时,才可以用


2.Constructor获取类的构造方法

Class类中的方法有很多,关于获取构造方法的方法就有4个。

不过好消息是,不用特意去记,因为他们的规律性极强!

助记技巧:

getConstructors()有个s,是复数形式,返回所有的公有构造方法(数组形式)

getDeclaredConstructors()多了个单词,declared,意思是声明,就是告诉编译器,他连private修饰的构造方法也要放进来

getDeclaredConstructor()和getConstructor()不带有s,是单数,所以返回一个构造方法

如果记住了这四个方法,下面获取字段和成员方法的方法基本上也就记住了。


下面是代码实操,获取类的构造方法:

1.获取所有公有构造方法:

执行结果:


2.获取所有构造方法,包括私有的:

执行结果:

此时,Student类中的所有构造方法,都在这里了。


3.获取单个构造方法:

执行结果:

小细节:

如果是要获取有参构造方法,参数要与类中的一直,顺序也不能改变,并且要在类型后面点一个class,获取字节码文件。

例如:

String.class

int.class


获取这些构造方法有什么用呢?

用处可多了,可以得到他们的访问修饰权限符、构造方法的参数等等。

idea对方法的提示和填入参数的提示,底层就是用这个实现的。


4.获取访问修饰权限符

注意:

访问权限修饰符的类型使用int型表示的,具体参照表格(了解即可):

执行结果:

1正好就是public


5.获取构造方法的参数类型

执行结果:


6.用获取的构造方法创建封装类的对象

没错,既然我们可以获取封装类的构造方法,那么就可实例化一个封装类的对象.

在Constructor类中调用newInstance(构造方法的参数)方法即可:

执行结果:

竟然报错了!

原因是:

constructor2是一个私有的构造方法

虽然我们可以通过getDecclaredConstructor()获取这个构造方法,

但是却不能直接用

解决办法:

constructor2.setAccssible(true)//临时取消权限校验

即可。

运行结果:

3.Field获取类的字段(成员变量)

执行结果:

 

其他的比如,所有字段/访问权限修饰符/数据类型等,

格式和获取构造方法的方式可以说一模一样,这里就不多演示了,都是写重复的方式,所以说反射其实并不难。

比如获取name的类型:

执行结果:


另外,Field还有特有的方法,可以获取并且修改成员变量记录的值(在new了一个封装类的对象后)

运行结果:

4.Method获取类的成员方法

其实写完前三个,这个就没有什么好写的了几乎就是十以内的加减法,换着数字考你。

值得注意的是,Method类拥有独属于自己的方法,例如:
获取方法抛出的异常,

获取方法的返回值,

调用获取的方法等等。

执行结果:


以上就是这篇文章的全部内容,自己动手试试,这块内容还是很看实践的。如果可以独立把代码敲出来,说明你就掌握的差不多了。

关于反射这块内容如果还有不清楚的,小编很推荐看一下B站的黑马程序员,讲的很细节,基本都是嚼碎了,喂给你的。

B站链接:java进阶教程进阶教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stomp 实战】Spring websocket 用户订阅和会话的管理源码分析

通过Spring websocket 用户校验和业务会话绑定我们学会了如何将业务会话绑定到spring websocket会话上。通过这一节,我们来分析一下会话和订阅的实现 用户会话的数据结构 SessionInfo 用户会话 用户会话定义如下: private static final class Sessio…

怎么让电脑耳机和音响都有声音

电脑耳机音响不能同时用没声音怎么办 一般来说,重新开机后问题能够得到解决。右击“我的电脑”---“属性”---“硬件”---“设备管理器”,打开“声音、视频和游戏控制器”有无问题,即看前面有没有出现黄色的“”。 如果您的 电脑 耳机能正常…

VMware虚拟机中ubuntu使用记录(4)—— 如何在VMware虚拟机中调用本机电脑的摄像头

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、虚拟机调用本机摄像头(1) 启动VMware USB 服务(2) 连接本机摄像头(3) 测试摄像头的连接 前言 通过配置虚拟机调用本机摄像头,用户可以在虚拟机…

Redis---------实现商品秒杀业务,包括唯一ID,超卖问题,分布式锁

订单ID必须是唯一 唯一ID构成: 代码生成唯一ID: import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.tim…

【论文阅读】Learning Texture Transformer Network for Image Super-Resolution

Learning Texture Transformer Network for Image Super-Resolution 论文地址Abstract1. 简介2.相关工作2.1单图像超分辨率2.2 Reference-based Image Super-Resolution 3. 方法3.1. Texture TransformerLearnable Texture Extractor 可学习的纹理提取器。Relevance Embedding.…

Qt QImageWriter类介绍

1.简介 QImageWriter 用于写入图像文件的类。它提供了将 QImage 对象保存到不同图像格式文件的功能,包括但不限于 PNG、JPEG、BMP 等。QImageWriter 可以将图像写入文件,也可以写入任何 QIODevice,如 QByteArray,这使得它非常灵活…

python中type,object,class 三者关系

type,object,class 三者关系 在python中&#xff0c;所有类的创建关系遵循&#xff1a; type -> int -> 1 type -> class -> obj例如&#xff1a; a 1 b "abc" print(type(1)) # <class int> 返回对象的类型 print(type(int)) …

基于OpenCv的图像金字塔

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

【讲解如何OpenCV入门】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

需求规格说明书编制书(word原件)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需…

GiantPandaCV | FasterTransformer Decoding 源码分析(二)-Decoder框架介绍

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FasterTransformer Decoding 源码分析(二)-Decoder框架介绍 作者丨进击的Killua 来源丨https://zhuanlan.zhihu.com/p/669303360 编辑丨GiantPand…

【Python编程实践1/3】模块

目录 目标 模块 import ​编辑 代码小结 题目 from...import 随机模块 代码小结 randint函数 骰子大战 choice函数 总结 目标 拧一颗螺丝&#xff0c;只会用到螺丝刀&#xff1b;但是修一台汽车&#xff0c;需要一整套汽修的工具。函数就像螺丝刀&#xff0c;可以帮…

python项目==一个web项目,配置模板指定文件清洗规则,调用模板规则清洗文件

代码地址 一个小工具。 一个web项目&#xff0c;配置模板指定文件清洗规则&#xff0c;调用模板规则清洗文件 https://github.com/hebian1994/csv-transfer-all 技术栈&#xff1a; SQLite python flask vue3 elementplus 功能介绍&#xff1a; A WEB tool for cleaning…

JavaScript:Web APIs(三)

本篇文章的内容包括&#xff1a; 一&#xff0c;事件流 二&#xff0c;移除事件监听 三&#xff0c;其他事件 四&#xff0c;元素尺寸与位置 一&#xff0c;事件流 事件流是什么呢&#xff1f; 事件流是指事件执行过程中的流动路径。 我们发现&#xff0c;一个完整的事件执行…

Delta lake with Java--利用spark sql操作数据1

今天要解决的问题是如何使用spark sql 建表&#xff0c;插入数据以及查询数据 1、建立一个类叫 DeltaLakeWithSparkSql1&#xff0c;具体代码如下&#xff0c;例子参考Delta Lake Up & Running第3章内容 import org.apache.spark.sql.SaveMode; import org.apache.spark.…

区域文本提示的实时文本到图像生成;通过一致性自注意力机制的视频生成工具保持视频的一致性;专门为雪佛兰汽车设计的客服聊天机器人

✨ 1: StreamMultiDiffusion StreamMultiDiffusion是首个基于区域文本提示的实时文本到图像生成框架&#xff0c;实现了高速且互动的图像生成。 StreamMultiDiffusion 旨在结合加速推理技术和基于区域的文本提示控制&#xff0c;以克服之前解决方案中存在的速度慢和用户交互性…

约瑟夫问题新解法

前言 又碰到了约瑟夫问题&#xff0c;这样的题目本来用环形链表模拟的话就能做出来。然而&#xff0c;最近新学习了一种做法&#xff0c;实在是有点震惊到我了。无论是思路上&#xff0c;还是代码量上&#xff0c;都是那么的精彩。就想也震惊一下其他人。谁能想到原来模拟出来四…

C/C++程序设计实验报告综合作业 | 小小计算器

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

深度解析 Spring 源码:探寻Bean的生命周期

文章目录 一、 Bean生命周期概述二、Bean生命周期流程图三、Bean生命周期验证3.1 代码案例3.2 执行结果 四、Bean生命周期源码4.1 setBeanName()4.2 setBeanFactory()4.3 setApplicationContext()4.4 postProcessBeforeInitialization()4.5 afterPropertiesSet()4.6 postProces…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…