Java反射:探索对象创建与类信息获取

news2024/12/27 3:42:04

文章目录

    • 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外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

C标准输入与标准输出——stdin,stdout

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路

简介&#xff1a; 随着数字化转型的飞速发展&#xff0c;企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案&#xff0c;极大地简化了应用程序的开发过程。在这一领域&#xff0c;iVX低代码平台作为领先的创业公司&#xff0c;正在…

【kafka】kafka介绍

https://kafka.apachecn.org/intro.html Apache Kafka是一个分布式流处理平台。这到底意味着什么呢? 我们知道流处理平台需要具有以下三种特性&#xff1a; 可以发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。可以储存流式的记录&#xff0c;并且有较好的…

初识自动驾驶技术之旅 第一课 学习笔记

​ &#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4da; 前言 &#x1f4d8; 1. 自动驾驶人才需求与挑战 &#x1f4d8; 2. Apollo …

什么合同管理系统?4类合同管理软件评测

说到合同管理系统&#xff0c;前提还是弄清楚合同有哪些类型&#xff0c;合同管理有那些痛点&#xff0c;才好对症下药。 一、合同的类型和合同管理的痛点 从法律角度来说&#xff0c;合同可以分为&#xff1a;有名合同与无名合同、单务合同与双务合同、有偿合同与无偿合同、…

Redis7安装配置

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

硬件系统工程师宝典(39)-----如何使用ESD防护器件?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们介绍了一些常用的视频接口DisplayPort、DVI和HDMI接口以及它们的特点。今天我们来讲一讲ESD防护器件。 1.ESD概念 ESD&#xff08;Electr…

约会怎么走到目的地最近呢?一文讲清所有最短路算法问题

&#x1f680;&#x1f680;&#x1f680;&#x1f680;&#x1f680;订阅专栏&#x1f449; 趣学算法(dog) &#x1f448; 带你学习算法原理 算法模板&#x1f680;&#x1f680;&#x1f680;&#x1f680;&#x1f680; write in front 朋友们好啊&#xff0c;好久没写过…

Android Studio开发入门教程:如何更改APP的图标?

更改APP的图标&#xff08;安卓系统&#xff09; 环境&#xff1a;Windows10、Android Studio版本如下图、雷电模拟器。 推荐图标库 默认APP图标 将新图标拉进src/main/res/mipmap-hdpi文件夹&#xff08;一般app的icon图标是存放在mipmap打头的文件夹下的&#xff09; 更改sr…

Java File类和IO流

1. File类 1.1 File对象创建 注意&#xff1a; 路径中"\"要写成"\\"&#xff0c; 路径中"/"可以直接用 File对象可以指代一个不存在的文件路径路径中带盘符是绝对路径&#xff0c;不带盘符是相对路径 1.2 File判断和获取方法 1.3 创建和删除方…

Kafka3.0.0版本——增加副本因子

目录 一、服务器信息二、启动zookeeper和kafka集群2.1、先启动zookeeper集群2.2、再启动kafka集群 三、增加副本因子3.1、增加副本因子的概述3.2、增加副本因子的示例3.2.1、创建topic(主题)3.2.2、手动增加副本存储 一、服务器信息 四台服务器 原始服务器名称原始服务器ip节点…

企业架构LNMP学习笔记15

客户端缓存&#xff1a; B/S架构里&#xff0c;Browser是浏览器&#xff0c;就是客户端。 客户端缓存告知浏览器获取服务段的信息是在某个区间时间段是有效的。 每次请求从服务器拿一遍数据&#xff0c;数据没有变化&#xff0c;影响带宽&#xff0c;影响时间。刷新又要去加载…

百度飞桨(武汉)人工智能产业赋能中心签约,推动AI技术与汉阳“1+6”产业深度融合

9月1日&#xff0c;“文心中国行”首站落地武汉汉阳。活动现场&#xff0c;武汉市汉阳区与百度正式签约&#xff0c;共同打造百度飞桨&#xff08;武汉&#xff09;人工智能产业赋能中心&#xff0c;助力武汉产业高质量跨越式发展。活动围绕“深入解读大模型产业实践&#xff0…

UWB学习——day1

UWB定义 UWB&#xff1a;Ultra Wideband&#xff08;超宽频&#xff09; UWB所谓的超宽频区别于其它近场通信技术可总结为时域上跳跃&#xff0c;频域上矮胖 从图中可以看出&#xff0c;时域上通过短且强的脉冲信号&#xff0c;频域上主要是超宽的频谱&#xff08;Spectrum&a…

979. 在二叉树中分配硬币;1136. 并行课程;759. 员工空闲时间

979. 在二叉树中分配硬币 核心思想&#xff1a;递归。定义dfs(node)&#xff0c;返回值为以当前节点为根节点的节点个数和硬币个数。 那么这棵树至少需要移入或者移出abs&#xff08;coins-nodes&#xff09;个硬币&#xff0c;也就是这么多步&#xff0c;然后累计它们的总和…

aarch64 arm64 部署 stable diffusion webui 笔记 【2】继续安装其他依赖 gfpgan

接上篇 aarch64 arm64 部署 stable diffusion webui 笔记 【1】准备 venv 安装pytorch 验证cuda_hkNaruto的博客-CSDN博客 编辑requirements_versions.txt&#xff0c;注释掉torch 启动webui.sh (venv) [rootceph3 stable-diffusion-webui]# useradd yeqiang useradd&#xf…

Pocket Yoga for mac:一个神奇的瑜伽助手,让你的身心更健康

Pocket Yoga for Mac&#xff08;口袋瑜伽&#xff09;是一款专为瑜伽爱好者设计的应用程序。无论您是初学者还是经验丰富的瑜伽修行者&#xff0c;这款应用都能帮助您在家中或办公室进行高效的瑜伽练习。 Pocket Yoga for Mac提供了一系列的瑜伽课程和练习&#xff0c;涵盖了不…

信息安全基础-技术体系-加密技术

系统安全 考点分析信息安全的基础知识&#xff08;重点&#xff09;信息安全系统的组成框架信息安全技术对称加密技术非对称加密对称密钥和非对称密钥对比 考点分析 一般不超纲 信息安全的基础知识&#xff08;重点&#xff09; 五个基本要素经常考察 机密性&#xff1a;加密报…

Python接口自动化测试框架介绍

之前在项目中搞了一套jmeter jenkins git ant接口自动化测试框架&#xff0c;在项目中运行了大半年了&#xff0c;效果还不错&#xff0c; 最近搞了一套requests unittest ddt pymysql BeautifulReport的接口自动化测试框架&#xff0c; 测试用例在yaml文件中&#xff0c…

Android后退堆栈

修改代码 现在的ItemClick使得用户单击其中一个项目时就会跳转&#xff0c;现在要修改其使得在一个小屏幕设备上才会这样做&#xff0c;在一个大屏幕设备上运行用户选择一个训练项目时在右边的片段显示响应的信息。 希望片段处理后退的方式&#xff1a;假设用户在手机上运行这…