java Class类与Field、Method、Constructor类

news2024/9/23 21:22:23

Java反射中的Class类和FieldMethodConstructor类是实现反射功能的核心类。它们提供了对类的元数据(metadata)的访问和操作能力。下面详细介绍这些类的概念、作用以及使用方法,并提供示例代码。

Class类

Class类表示一个类或接口的类型信息。每个类或接口都有一个与之关联的Class对象,这个对象封装了类或接口的所有信息,包括构造方法、方法、字段等。

获取Class对象的方式
  1. 通过类名直接获取

    1Class<?> clazz = String.class;
  2. 通过对象的getClass()方法

    1String str = "hello";
    2Class<?> clazz = str.getClass();
  3. 通过Class.forName()方法

    1Class<?> clazz = Class.forName("java.lang.String");

Field类

Field类表示类中的字段(变量)。通过Class对象可以获取类的所有字段,并对其进行操作。

获取Field对象
  1. 获取公共字段

    1Field[] fields = clazz.getFields();
  2. 获取所有字段(包括私有和受保护的字段)

    1Field[] declaredFields = clazz.getDeclaredFields();
操作Field对象
  1. 获取字段值

    1Field field = clazz.getField("fieldName");
    2Object fieldValue = field.get(instance);
  2. 设置字段值

    1Field field = clazz.getDeclaredField("fieldName");
    2field.setAccessible(true); // 设置为可访问私有字段
    3field.set(instance, value);

Method类

Method类表示类中的方法。通过Class对象可以获取类的所有方法,并对其进行调用。

获取Method对象
  1. 获取公共方法

    1Method[] methods = clazz.getMethods();
  2. 获取所有方法(包括私有和受保护的方法)

    1Method[] declaredMethods = clazz.getDeclaredMethods();
调用Method对象
  1. 调用方法

    1Method method = clazz.getMethod("methodName", Class<?>... parameterTypes);
    2Object result = method.invoke(instance, parameters);
  2. 调用私有方法

    1Method method = clazz.getDeclaredMethod("methodName", Class<?>... parameterTypes);
    2method.setAccessible(true); // 设置为可访问私有方法
    3Object result = method.invoke(instance, parameters);

Constructor类

Constructor类表示类中的构造方法。通过Class对象可以获取类的所有构造方法,并使用它们来创建对象。

获取Constructor对象
  1. 获取公共构造方法

    1Constructor<?>[] constructors = clazz.getConstructors();
  2. 获取所有构造方法(包括私有和受保护的构造方法)

    1Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
使用Constructor对象创建对象
  1. 创建对象

    1Constructor<?> constructor = clazz.getConstructor(Class<?>... parameterTypes);
    2Object instance = constructor.newInstance(parameters);
  2. 创建私有构造方法的对象

    1Constructor<?> constructor = clazz.getDeclaredConstructor(Class<?>... parameterTypes);
    2constructor.setAccessible(true); // 设置为可访问私有构造方法
    3Object instance = constructor.newInstance(parameters);

示例代码

下面是一个完整的示例代码,展示了如何使用ClassFieldMethodConstructor类:

1public class ReflectionExample {
2    public static void main(String[] args) {
3        try {
4            // 获取Class对象
5            Class<?> clazz = MyClass.class;
6
7            // 创建对象
8            Constructor<?> constructor = clazz.getConstructor(String.class);
9            MyClass obj = (MyClass) constructor.newInstance("hello");
10
11            // 调用方法
12            Method method = clazz.getMethod("printMessage", new Class[]{});
13            method.invoke(obj);
14
15            // 修改字段值
16            Field field = clazz.getField("message");
17            field.setAccessible(true); // 设置为可访问私有字段
18            field.set(obj, "world");
19            System.out.println(field.get(obj)); // 输出 world
20        } catch (Exception e) {
21            e.printStackTrace();
22        }
23    }
24}
25
26class MyClass {
27    private String message;
28
29    public MyClass(String message) {
30        this.message = message;
31    }
32
33    public void printMessage() {
34        System.out.println(message);
35    }
36}

详细解释

  1. 获取Class对象

    1Class<?> clazz = MyClass.class;
  2. 获取构造方法并创建对象

    1Constructor<?> constructor = clazz.getConstructor(String.class);
    2MyClass obj = (MyClass) constructor.newInstance("hello");
  3. 获取方法并调用

    1Method method = clazz.getMethod("printMessage", new Class[]{});
    2method.invoke(obj);
  4. 获取字段并修改值

    1Field field = clazz.getField("message");
    2field.setAccessible(true); // 设置为可访问私有字段
    3field.set(obj, "world");
    4System.out.println(field.get(obj)); // 输出 world

注意事项

  1. 性能影响:反射操作通常比普通操作慢得多,因此在性能敏感的应用中应谨慎使用。
  2. 安全性问题:反射可以绕过访问权限限制,因此可能带来潜在的安全风险。
  3. 异常处理:使用反射时,需要妥善处理可能出现的各种异常,如ClassNotFoundExceptionNoSuchMethodExceptionIllegalAccessException等。

总结

Java反射中的Class类和FieldMethodConstructor类提供了对类的元数据的访问和操作能力。通过这些类,可以在运行时动态地获取和操作类的信息,从而实现高度动态和灵活的应用程序。掌握这些基本概念和用法后,可以进一步探索更高级的反射特性和应用场景。

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

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

相关文章

ios swift5 UITextView占位字符,记录限制字数

文章目录 截图代码&#xff1a;具体使用代码&#xff1a;CustomTextView 截图 代码&#xff1a;具体使用 scrollView.addSubview(contentTextView)contentTextView.placeholderLabel.text LocalizableManager.localValue("write_comment")contentTextView.maxCharac…

分享两个虚拟试衣工具,一个在线,一个离线,还有ComfyUI插件

SAM &#xff0c;对不住了&#xff01; 我没记错的话&#xff0c;OpenAI CEO&#xff0c;性别男&#xff0c;取向男&#xff0c;配偶男。 这又让我联想到了苹果CEO库克... 所以OpenAI和Apple可以一啪即合。 钢铁直男老马就和他们都不对付~~ 开个玩笑&#xff0c;聊…

以数赋能实景三维创新“科技+文旅”

在数字化时代&#xff0c;科技与文化的融合为我们带来了无限可能。今天&#xff0c;我们将探讨如何利用实景三维技术&#xff0c;推动“科技文旅”的创新发展。 1. 实景三维技术概述 实景三维技术&#xff0c;是一种集成了遥感、地理信息系统&#xff08;GIS&#xff09;、三…

量子计算如何引发第四次工业革命——解读加来道雄的量子物理观

在科技的历史长河中&#xff0c;人类经历了多次重大的技术变革&#xff1a;从第一次工业革命的蒸汽机到第三次计算机革命的互联网与半导体技术&#xff0c;每次技术革命都彻底改变了我们的生活。而如今&#xff0c;我们正处在第四次工业革命的前夕&#xff0c;其核心驱动力是量…

mybatis 配置文件完成增删改查(一):直接查询所有信息

文章目录 编写三步走查询所有编写接口方法编写sql语句执行方法&#xff0c;测试结果数据库字段名和实体类变量名不一致&#xff1a;ResultMap数据库字段名和实体类变量名不一致&#xff1a;方法二 编写三步走 编写接口方法&#xff1a;Mapper接口 参数有无 结果类型编写sql语句…

【Python】PythonRobotics:机器人算法的 Python 实现

在机器人技术的研究和开发中&#xff0c;理解和实现各种机器人算法是至关重要的。PythonRobotics 是一个开源项目&#xff0c;它提供了大量机器人算法的 Python 实现&#xff0c;这些算法覆盖了机器人科学的多个领域&#xff0c;包括定位、建图、导航、路径规划等。 ⭕️宇宙起…

nicegui标签组件lable用法深度解读和示例,源代码IDE运行和调试通过,截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…

美版iPhone 16 Pro完美改卡,15 Pro再见了

资深果粉应该都知道&#xff0c;从iPhone 14起&#xff0c;所有美版的iPhone&#xff0c;都从eSIM实体SIM&#xff0c;改成了全eSIM方案&#xff0c;彻底放弃了实体卡槽&#xff0c;这就给卡贴机这一行业造成了毁灭性的打击。 因为国内无法使用eSIM&#xff0c;即使有低价的美版…

什么是上层封禁海外流量

上层封禁海外流量&#xff08;Upper-layer Blocking of Overseas Traffic&#xff09;是一种网络安全策略&#xff0c;旨在通过在网络传输的上层进行流量控制和过滤&#xff0c;从而阻止来自海外的恶意流量或不必要的访问。这一措施主要用于防止分布式拒绝服务&#xff08;DDoS…

C++笔记---set和map

1. 序列式容器与关联式容器 前面我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关…

数据驱动农业——农业中的大数据

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

win操作系统各个版本下载

MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn) 下载地址链接转换工具 - 在线工具 (tool.lu) 通过这个网站可以再将ed2k转换成别的下载工具链接

LLM安全风险及应对

LLM安全风险主要从四个维度分析&#xff1a;用户输入、训练数据、模型本身以及工具和插件。 风险类别具体风险风险解释应对措施具体举例用户输入相关风险提示注入&#xff08;Prompt Injection&#xff09;攻击者通过设计特定输入&#xff0c;使模型生成恶意或不安全的输出。- …

进度调度切换

tips&#xff1a; 进程&#xff1d;内核数据结构&#xff08;PCB/task_struct&#xff09;&#xff0b;代码和数据 UID&#xff1a;每个用户对应的id 进程分类 & 进程关系 僵尸进程 父在子死 进程退出 代码不会再执行了&#xff0c;系统可以立即释放对应代码和数据进程…

推荐一款开源的Redis桌面客户端

TinyRDM 是一个现代化的、轻量级的跨平台 Redis 桌面客户端&#xff0c;能在 Mac、Windows 和 Linux 系统上使用。它有着现代化的设计风格&#xff0c;界面既简洁又清晰&#xff0c;操作起来方便又高效。不管是刚开始接触的新手&#xff0c;还是经验丰富的开发者&#xff0c;都…

【安装教程】Windows环境下Neo4j的安装与配置

【安装教程】Windows环境下Neo4j的安装与配置 Neo4j的概念一、安装前准备——JDK二、Neo4j的安装三、Neo4j的环境配置四、安装验证 Neo4j的概念 Neo4j 是一个高性能的图形数据库管理系统&#xff0c;它使用图形模型来存储和处理数据。Neo4j 的图形模型由节点和边组成&#xff0…

WebLogic 漏洞复现

1、后台弱⼝令GetShell 默认账号密码&#xff1a;weblogic/Oracle123 weblogic常⽤弱⼝令&#xff1a;https://cirt.net/passwords?criteriaweblogic 这⾥注意&#xff0c; 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…

矩阵分析 线性空间和线性变换 笔记手稿

1线性空间的概念 数域 线性空间 证明 线性相关和线性无关 线性空间的基 基的性质 基变换和坐标变换 子空间和维数定理 两个子空间的交和和都是子空间 维数公式 子空间扩充定理 维数公式及其证明 直和 证明 线性空间的同构 注意&#xff1a;映射的概念 同构的性质 线性变换的…

前端组件库Element UI 的使用

一、准备工作 1.确保安装了开发软件 VS Code&#xff08;此处可查阅安装 VS Code教程&#xff09;&#xff0c;确保相关插件安装成功 2.安装Node.js 和创建Vue项目&#xff08;此处可查阅安装创建教程&#xff09; 3.成功在VS Code运行一个Vue项目&#xff08;此处可查阅运行…

HTML+CSS学习笔记

目录 HTML 1.开发环境 2.创建HTML文件 3.HTML元素 3.1HTML文件结构 3.2HTML标签 3.3HTML属性​编辑​编辑 3.4HTML区块 3.4.1块元素 3.4.2行内元素 3.5HTML表单 CSS 1.CSS简介 2.CSS语法​编辑 3.CSS三种导入方式 内联样式 内部样式 外部样式 4.选择器​ 5.C…