Java反射:探索对象创建与类信息获取
文章目录
- 1. 对象的创建
- 2. 类的初始化
- 2.1 类的加载
- 2.2 类的连接
- 2.3 类的初始化
- 3. 反射是什么?
- 4. 获取Class类对象
- 4.1 使用类名.class
- 4.2 使用对象的getClass()方法
- 4.3 使用Class.forName()
- 5. 获取构造器对象
- 5.1 使用getConstructors()和getDeclaredConstructors()
- 5.2 使用getConstructor()和getDeclaredConstructor()
- 6. 获取成员变量对象
- 6.1 使用getFields()和getDeclaredFields()
- 6.2 使用getField()和getDeclaredField()
- 7. 获取成员方法对象
- 8. 总结

🎉欢迎来到Java学习路线专栏~Java反射:探索对象创建与类信息获取
- ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
- ✨博客主页:IT·陈寒的博客
- 🎈该系列文章专栏:Java学习路线
- 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
- 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
- 📜 欢迎大家关注! ❤️
Java是一门强大而灵活的编程语言,其中的反射机制允许我们在运行时获取和操作类的信息。本文将深入探讨反射的原理和用法,包括对象的创建、类的初始化、获取Class对象以及访问构造器、成员变量和成员方法。通过了解和掌握反射,您将能够编写更具通用性和灵活性的Java应用程序。
1. 对象的创建
首先,让我们回顾一下在Java中如何创建对象。通常,我们使用以下方式创建对象:
Student stu = new Student("张无忌", 18);
在这个例子中,stu
是一个引用,它指向了内存中的一个对象。Student
是一个类,它存在于磁盘上的.class文件中。这是我们通常创建对象的方式,但在某些情况下,我们需要更灵活的方式来创建对象,这就是反射发挥作用的地方。
2. 类的初始化
在深入探讨反射之前,让我们了解一下类的初始化过程。类的初始化包括三个步骤:
2.1 类的加载
在类的加载阶段,Java虚拟机将类文件(.class)从磁盘加载到内存中。这个过程由类加载器(ClassLoader)来完成。
2.2 类的连接
在类的连接阶段,内存会为类的静态变量分配内存,并进行默认初始化。静态变量在类加载时会被初始化。
2.3 类的初始化
在类的初始化阶段,静态变量会被赋予程序员指定的初始值。在上面的例子中,name
被赋值为 “张无忌”,age
被赋值为 18。
3. 反射是什么?
反射是Java中的一种机制,允许在运行时获取一个类的变量和方法的信息,然后通过这些信息来创建对象、访问变量和调用方法。反射机制使我们可以在编译时未知类的情况下操作类。
4. 获取Class类对象
在使用反射之前,我们首先需要获取一个类的Class对象。有三种常用的方式来获取Class对象:
4.1 使用类名.class
Class<Student> studentClass = Student.class;
4.2 使用对象的getClass()方法
Student student = new Student();
Class<? extends Student> studentClass = student.getClass();
4.3 使用Class.forName()
Class<?> studentClass = Class.forName("com.example.Student");
5. 获取构造器对象
反射允许我们获取类的构造器对象,从而创建对象。有两种主要的方法来获取构造器对象:
5.1 使用getConstructors()和getDeclaredConstructors()
Constructor<?>[] constructors = Student.class.getConstructors(); // 获取所有非私有构造器
Constructor<?>[] declaredConstructors = Student.class.getDeclaredConstructors(); // 获取所有构造器
5.2 使用getConstructor()和getDeclaredConstructor()
Constructor<Student> constructor = Student.class.getConstructor(String.class, int.class); // 获取指定参数类型的构造器
Constructor<Student> declaredConstructor = Student.class.getDeclaredConstructor(String.class, int.class); // 获取指定参数类型的构造器
通过获取构造器对象,我们可以使用构造器的newInstance
方法来创建类的对象:
Student student = constructor.newInstance("张无忌", 18);
6. 获取成员变量对象
反射还允许我们获取类的成员变量对象,以便读取和修改对象的属性。有两种方法来获取成员变量对象:
6.1 使用getFields()和getDeclaredFields()
Field[] fields = Student.class.getFields(); // 获取所有非私有成员变量
Field[] declaredFields = Student.class.getDeclaredFields(); // 获取所有成员变量
6.2 使用getField()和getDeclaredField()
Field field = Student.class.getField("name"); // 获取指定名称的非私有成员变量
Field declaredField = Student.class.getDeclaredField("age"); // 获取指定名称的成员变量
通过获取成员变量对象,我们可以使用set
方法来修改对象的属性值:
field.set(student, "新的名字"); // 设置属性值
7. 获取成员方法对象
反射还允许我们获取类的成员方法对象,以便调用对象的方法。有两种方法来获取成员方法对象:
Method[] methods = Student.class.getMethods(); // 获取所有非私有方法
Method[] declaredMethods = Student.class.getDeclaredMethods(); // 获取所有方法
通过获取成员方法对象,我们可以使用invoke
方法来调用对象的方法:
Method method = Student.class.getMethod("getName"); // 获取指定名称的方法
String name = (String) method.invoke(student); // 调用方法
8. 总结
反射是Java中一个强大而灵活的机制,允许我们在运行时获取和操作类的信息。通过获取Class对象、构造器对象、成员变量对象和成员方法对象,我们可以实现动态创建对象、修改属性和调用方法的功能。反射虽然强大,但也需要谨慎使用,因为它会降低代码的可读性和性能。在实际应用中,应该根据需要谨慎使用反射,以充分发挥其优势。
希望本文能够帮助理解反射的基本原理和用法,更灵活地编写Java应用程序,并更好地应对各种复杂的情况。在深入学习和实践中,更好地掌握反射这一强大工具,提高自己的编程技能。
🧸结尾
❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:
- 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
- 【Java学习路线】2023年完整版Java学习路线图
- 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
- 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
- 【数据结构学习】从零起步:学习数据结构的完整路径
相关文章:

Java反射:探索对象创建与类信息获取
文章目录 1. 对象的创建2. 类的初始化2.1 类的加载2.2 类的连接2.3 类的初始化 3. 反射是什么?4. 获取Class类对象4.1 使用类名.class4.2 使用对象的getClass()方法4.3 使用Class.forName() 5. 获取构造器对象5.1 使用getConstructors()和getDeclaredConstructors()…...

【100天精通Python】Day55:Python 数据分析_Pandas数据选取和常用操作
目录 Pandas数据选择和操作 1 选择列和行 2 过滤数据 3 添加、删除和修改数据 4 数据排序 Pandas数据选择和操作 Pandas是一个Python库,用于数据分析和操作,提供了丰富的功能来选择、过滤、添加、删除和修改数据。 1 选择列和行 Pandas 提供了多种…...
f12工具
抓包工具 elements查看器: 可用于自动化脚本的元素定位,前端页面-html页面 Selenium提供了八种定位元素方式 1、id 2、name 3、class_name 4、tag_name 5、link_text 6、partial_link_text 7、XPath(倾向于用相对路径://input【name“phone”】…...
Spring MVC实现RESTful
在 Spring MVC 中,我们可以通过 RequestMapping PathVariable 注解的方式,来实现 RESTful 风格的请求。 1. 通过RequestMapping 注解的路径设置 当请求中携带的参数是通过请求路径传递到服务器中时,我们就可以在 RequestMapping 注解的 val…...

ClickHouse配置Hdfs存储数据
文章目录 背景配置单机配置HA高可用Hdfs集群性能测试统计trait最多的10个trait term统计性状xxx minValue > 500 0000的数量结论 参考文档 背景 由于公司初始使用Hadoop这一套,所以希望ClickHouse也能使用Hdfs作为存储 看了下ClickHouse的文档,拿Hdf…...

zabbix监控网络设备和zabbix proxy
监控linux主机 [rootrocky8 conf]# yum -y install net-snmp vim /etc/snmp/snmpd.conf com2sec notConfigUser default 123456##修改此行,设置团体密码,默认为public,此处 改为123456 view systemview included .1. ##添加此行,自定义授权,否则 zabbix 无法获取数据 [rootr…...

halcon双目标定双相机标定
halcon双目标定 *取消更新 dev_update_off () *获取窗体句柄 dev_get_window (WindowHandle) *设置窗体字体样式 set_display_font (WindowHandle, 16, mono, true, false) *设置线条粗细 dev_set_line_width (3) *创建空对象 gen_empty_obj (ImageL) *读取指定文件内子集 li…...

Vue框架学习记录之环境安装与第一个Vue项目
Node.js的安装与配置 首先是Node.js的安装,安装十分简单,只需要去官网下载安装包后,一路next即可。 Node.js是一个开源的、跨平台的 JavaScript 运行时环境 下载地址,有两个版本,一个是推荐的,一个是最新…...

【DockerCE】Docker-CE 24.0.6正式版发布
官网下载地址(For RHEL/CentOS 7.9): https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 相对于24.0.5版本,本次24.0.6版本更新的rpm包有 5 个,使用目录对比软件对比的结果如下: 在Lin…...

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)
文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 1.2 图的矩阵表示1.2.1 邻接矩阵1.2.2 可达矩阵1.2.3 关联矩阵1.2.4 权矩阵 写在最后 引言 按照正常进度应该学习动态规划了,但我想…...

支持CAN FD的Kvaser PCIEcan 4xCAN v2编码: 73-30130-01414-5如何应用?
这里是引用 Kvaser PCIEcan 4xCAN v2(编码: 73-30130-01414-5)是一款小巧而先进的多通道实时CAN接口,可发送和接收CAN总线上的标准和扩展CAN消息,时间戳精度高。其与所有使用Kvaser CANlib的应用程序兼容。 主要特性 PCI Express…...

经济2023---风口
改革开放以来,中国共有12次比较好的阶级跃迁的机会: 包括80年代选部委院校、办乡镇企业、倒卖商品;90年代下海、选外语外贸、炒股;00年代从事资源品行业、选金融、炒房;10年代选计算机、搞互联网、买比特币。 从这里…...
JWFD开源工作流-矩阵引擎设计-高维向量空间分析法
JWFD开源工作流-矩阵引擎设计-高维向量空间分析法 在把已知的流程节点查找到之后,输出下标,但是我们发现,还有一些节点并未被 探测到,遍历并没有完全的完成,仍然有泄露的节点在其中,这个问题…...
WIN10访问Ubuntu的Samba
WIN10访问Ubuntu的Samba 在Ubuntu中安装好Samba后,如果无法在Win10里访问共享目录或者无法进行写操作,可以进行如下检查: 检查用户是否添加到共享和共享组 $ sudo adduser yourname sambashare 可以编辑:,查看文件/etc…...
AbstractExecutorService 抽象类
java.util.concurrent.AbstractExecutorService 是 Java 并发编程中的一个抽象类,它定义了 ExecutorService 接口的基本行为。ExecutorService 是一个接口,它提供了一种以异步方式执行任务的方法。 AbstractExecutorService 类包含以下一些重要的方法: void execute(Runnab…...
Android12 ethernet和wifi共存
1.修改网络优先走wifi packages/modules/Connectivity/service/src/com/android/server/connectivity/NetworkRanker.java -44,7 44,7 import java.util.Arrays;import java.util.Collection;import java.util.List;import java.util.function.Predicate; - import andro…...

记录使用layui弹窗实现签名、签字
一、前言 本来项目使用的是OCX方式做签字的,因为项目需要转到国产化,不在支持OCX方式,需要使用前端进行签字操作 注:有啥问题看看文档,或者换着思路来,本文仅供参考! 二、使用组件 获取jSign…...

【AIGC系列】Stable Diffusion 小白快速入门课程大纲
一、前言 本文是《Stable Diffusion 从入门到企业级应用实战》系列课程的前置学习引导部分,《Stable Diffusion新手完整学习地图课程》的课程大纲。该课程主要的培训对象是: 没有人工智能背景,想快速上手Stable Diffusion的初学者;想掌握St…...

在kali环境下安装Beef-Xss靶场搭建
目录 一、更新安装包 二、安装beef-xss 三、启动Beef-Xss工具 1、查看hook.js 2、查看后台登录地址 3、查看用户名和登录密码 4、登录页面 5、点击 Hook me:将配置的页面导入BEEF中 一、更新安装包 ┌──(root㉿kali)-[/home/kali] └─# apt-get update 二、安装be…...

【Apollo】自动驾驶技术的介绍
阿波罗是百度发布的名为“Apollo(阿波罗)”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...