当前位置: 首页 > news >正文

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. 反射是什么&#xff1f;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库&#xff0c;用于数据分析和操作&#xff0c;提供了丰富的功能来选择、过滤、添加、删除和修改数据。 1 选择列和行 Pandas 提供了多种…...

f12工具

抓包工具 elements查看器&#xff1a; 可用于自动化脚本的元素定位,前端页面-html页面 Selenium提供了八种定位元素方式 1、id 2、name 3、class_name 4、tag_name 5、link_text 6、partial_link_text 7、XPath(倾向于用相对路径&#xff1a;//input【name“phone”】…...

Spring MVC实现RESTful

在 Spring MVC 中&#xff0c;我们可以通过 RequestMapping PathVariable 注解的方式&#xff0c;来实现 RESTful 风格的请求。 1. 通过RequestMapping 注解的路径设置 当请求中携带的参数是通过请求路径传递到服务器中时&#xff0c;我们就可以在 RequestMapping 注解的 val…...

ClickHouse配置Hdfs存储数据

文章目录 背景配置单机配置HA高可用Hdfs集群性能测试统计trait最多的10个trait term统计性状xxx minValue > 500 0000的数量结论 参考文档 背景 由于公司初始使用Hadoop这一套&#xff0c;所以希望ClickHouse也能使用Hdfs作为存储 看了下ClickHouse的文档&#xff0c;拿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的安装&#xff0c;安装十分简单&#xff0c;只需要去官网下载安装包后&#xff0c;一路next即可。 Node.js是一个开源的、跨平台的 JavaScript 运行时环境 下载地址&#xff0c;有两个版本&#xff0c;一个是推荐的&#xff0c;一个是最新…...

【DockerCE】Docker-CE 24.0.6正式版发布

官网下载地址&#xff08;For RHEL/CentOS 7.9&#xff09;&#xff1a; https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 相对于24.0.5版本&#xff0c;本次24.0.6版本更新的rpm包有 5 个&#xff0c;使用目录对比软件对比的结果如下&#xff1a; 在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 权矩阵 写在最后 引言 按照正常进度应该学习动态规划了&#xff0c;但我想…...

支持CAN FD的Kvaser PCIEcan 4xCAN v2编码: 73-30130-01414-5如何应用?

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

经济2023---风口

改革开放以来&#xff0c;中国共有12次比较好的阶级跃迁的机会&#xff1a; 包括80年代选部委院校、办乡镇企业、倒卖商品&#xff1b;90年代下海、选外语外贸、炒股&#xff1b;00年代从事资源品行业、选金融、炒房&#xff1b;10年代选计算机、搞互联网、买比特币。 从这里…...

JWFD开源工作流-矩阵引擎设计-高维向量空间分析法

JWFD开源工作流-矩阵引擎设计-高维向量空间分析法 在把已知的流程节点查找到之后&#xff0c;输出下标&#xff0c;但是我们发现&#xff0c;还有一些节点并未被 探测到&#xff0c;遍历并没有完全的完成&#xff0c;仍然有泄露的节点在其中&#xff0c;这个问题…...

WIN10访问Ubuntu的Samba

WIN10访问Ubuntu的Samba 在Ubuntu中安装好Samba后&#xff0c;如果无法在Win10里访问共享目录或者无法进行写操作&#xff0c;可以进行如下检查&#xff1a; 检查用户是否添加到共享和共享组 $ sudo adduser yourname sambashare 可以编辑&#xff1a;&#xff0c;查看文件/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方式做签字的&#xff0c;因为项目需要转到国产化&#xff0c;不在支持OCX方式&#xff0c;需要使用前端进行签字操作 注&#xff1a;有啥问题看看文档&#xff0c;或者换着思路来&#xff0c;本文仅供参考&#xff01; 二、使用组件 获取jSign…...

【AIGC系列】Stable Diffusion 小白快速入门课程大纲

一、前言 本文是《Stable Diffusion 从入门到企业级应用实战》系列课程的前置学习引导部分&#xff0c;《Stable Diffusion新手完整学习地图课程》的课程大纲。该课程主要的培训对象是&#xff1a; 没有人工智能背景,想快速上手Stable Diffusion的初学者&#xff1b;想掌握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&#xff08;阿波罗&#xff09;”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

day51 python CBAM注意力

目录 一、CBAM 模块简介 二、CBAM 模块的实现 &#xff08;一&#xff09;通道注意力模块 &#xff08;二&#xff09;空间注意力模块 &#xff08;三&#xff09;CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...