Class类的详细说明


Class类的详细说明

Class 类是Java反射机制的核心,每个Java类或接口在JVM中都有一个对应的 Class 对象,用于表示该类的元数据(如类名、方法、字段、构造器等)。以下是其核心知识点:


1. 获取Class对象的三种方式
方式示例适用场景
类名.classClass<String> clazz = String.class;已知具体类名,编译时确定。
对象.getClass()String s = "hello"; Class<?> clazz = s.getClass();通过已有对象获取类信息。
Class.forName()Class<?> clazz = Class.forName("java.lang.String");动态加载类,需全限定类名(全限定类名是带有包名的)。

2. Class类的核心方法

(1) 获取类的基本信息
方法作用
String getName()返回全限定类名(如 java.lang.String)。
String getSimpleName()返回简单类名(如 String)。
Package getPackage()返回类所在的包信息(包名、注解等)。
int getModifiers()返回类的修饰符(如 publicfinal),需配合 Modifier 类解析。
boolean isInterface()判断是否为接口。

(2) 获取继承关系
方法作用
Class<?> getSuperclass()返回直接父类的 Class 对象(若为 Object 则返回 null)。
Class<?>[] getInterfaces()返回类实现的所有接口的 Class 数组。

(3) 操作字段(Field)
方法作用
Field getField(String name)获取指定名称的公共字段(包括继承的)。
Field getDeclaredField(String name)获取类声明的字段(包括私有、受保护),不包含继承字段
Field[] getFields()获取所有公共字段(包括继承的)。
Field[] getDeclaredFields()获取类声明的所有字段(包括私有、受保护)。

(4) 操作方法(Method)
方法作用
Method getMethod(String name, Class<?>... parameterTypes)获取指定名称和参数的公共方法(包括继承的)。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)获取类声明的指定方法(包括私有、受保护),不包含继承方法
Method[] getMethods()获取所有公共方法(包括继承的)。
Method[] getDeclaredMethods()获取类声明的所有方法(包括私有、受保护)。

(5) 操作构造器(Constructor)
方法作用
Constructor<?>[] getConstructors()获取所有公共构造方法。
Constructor<?>[] getDeclaredConstructors()获取所有声明的构造方法(包括私有)。
Constructor<T> getConstructor(Class<?>... parameterTypes)获取指定参数类型的公共构造方法。
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)获取指定参数类型的声明构造方法(包括私有)。

(6) 实例化对象
方法作用
T newInstance()已过时:通过默认无参构造器创建实例(需存在无参构造方法)。
替代方案:通过 Constructor 对象示例:
```java
Constructor constructor =
User.class.getConstructor(String.class);
User user = constructor.newInstance(“Alice”);
```

(7) 其他实用方法
方法作用
Annotation[] getAnnotations()获取类上的所有注解(包括元注解)。
ClassLoader getClassLoader()返回类的类加载器。
boolean isArray()判断是否为数组类型。
Class<?> getComponentType()返回数组类型的元素类型(如 String[].class.getComponentType()String.class)。

3. 示例代码

(1) 获取类信息
Class<?> clazz = Class.forName("java.util.ArrayList");
System.out.println("类名: " + clazz.getName());        // java.util.ArrayList
System.out.println("简单类名: " + clazz.getSimpleName()); // ArrayList
System.out.println("包名: " + clazz.getPackage().getName()); // java.util
(2) 操作私有字段
public class User {private String name;public User(String name) { this.name = name; }
}Class<User> clazz = User.class;
User user = clazz.getConstructor(String.class).newInstance("Alice");Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true); // 允许访问私有字段
nameField.set(user, "Bob");
System.out.println(nameField.get(user)); // 输出: Bob
(3) 调用私有方法
public class Calculator {private int add(int a, int b) { return a + b; }
}Class<Calculator> clazz = Calculator.class;
Calculator calc = clazz.newInstance();Method addMethod = clazz.getDeclaredMethod("add", int.class, int.class);
addMethod.setAccessible(true);
int result = (int) addMethod.invoke(calc, 3, 5);
System.out.println(result); // 输出: 8

4. 注意事项

  1. 性能开销:反射操作比直接调用慢约10倍,避免高频使用。
  2. 安全限制:私有成员访问需调用 setAccessible(true),可能触发安全管理器异常。
  3. 代码可读性:反射代码较难维护,需添加详细注释。
  4. 兼容性:反射可能因JDK版本或类结构变化而失效。

总结

Class 类是Java反射的基石,通过它可以在运行时动态获取和操作类信息。核心方法涵盖类结构解析、实例化、字段/方法访问等场景,但在生产环境中需谨慎使用,权衡灵活性与性能、安全性的关系。

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

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

相关文章

[逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)

[逆向工程]C实现DLL注入&#xff1a;原理、实现与防御全解析&#xff08;二十五&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09;是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#x…

【ROS2实战】在中国地区 Ubuntu 22.04 上安装 ROS 2 Humble 教程

本文介绍如何在中国大陆环境下顺利安装 ROS 2 Humble&#xff0c;包括使用清华镜像源、解决 locale 和 GPG 密钥问题、安装 ROS 软件包以及配置自动环境加载。 &#x1f31f; ROS 2 版本简介 ROS 2 是机器人操作系统的第二代版本&#xff0c;目前主要有两个长期支持&#xff0…

嵌入式学习笔记 - STM32 ADC 模块工作模式总结

ADC 模式总结&#xff1a; 一 单ADC模式&#xff08;是指ADC1,ADC2,ADC3中只有一个ADC被使用&#xff09; ①单通道&#xff1a; 非连续模式&#xff1a;非连续的意思就是单次&#xff0c;一次转换完成后就停止转换&#xff0c;除非再次被软件或者被外部触发启动&#xff1b…

Python训练打卡Day26

函数专题1&#xff1a;函数定义与参数 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 到目前为…

使用Docker部署Nacos

sudo systemctl start docker sudo systemctl enable docker docker --version 步骤 2: 拉取 Nacos Docker 镜像 拉取 Nacos 镜像&#xff1a; 你可以从 Docker Hub 上拉取官方的 Nacos 镜像&#xff0c;使用以下命令&#xff1a; docker pull nacos/nacos-server 这会从 …

Ubuntu 添加系统调用

实验内容 通过内核编译法添加一个不用传递参数的系统调用&#xff0c;其功能可自定义。 &#xff08;1&#xff09;添加系统调用号&#xff0c;系统会根据这个号找到syscall_table中的相应表项。具体做法是在syscall_64.tbl文件中添加系统调用号和调用函数的对应关系。 &#…

Javascript:WebAPI

获取网页元素 queryselector queryselector是 JavaScript 中用于选择 DOM 元素的重要方法&#xff0c;它允许使用 CSS 选择器语法来查找页面中的元素。 一般queryselector获取的元素都是html中第一个选择器的元素 支持选择器类型&#xff1a;类选择器(.class) &#xff0c…

十二、Hive 函数

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月1日 专栏&#xff1a;Hive教程 在数据处理的广阔天地中&#xff0c;我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库&#xff0c;它们就像魔法师手中的魔法棒&…

Linux之Nginx安装及配置原理篇(一)

Nginx安装及配置 前情回顾 首先针对Nginx进程模型&#xff0c;我们回顾一下它的原理机制&#xff0c;我们知道它是通过Master通过fork分发任务节点给予work节点&#xff0c;然后work节点触发了event事件&#xff0c;之后通过一个access_muttex互斥锁&#xff0c;来单线程调用我…

嵌入式培训之数据结构学习(五)栈与队列

一、栈 &#xff08;一&#xff09;栈的基本概念 1、栈的定义&#xff1a; 注&#xff1a;线性表中的栈在堆区&#xff08;因为是malloc来的&#xff09;&#xff1b;系统中的栈区存储局部变量、函数形参、函数返回值地址。 2、栈顶和栈底&#xff1a; 允许插入和删除的一端…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…

ARP Detection MAC-Address Static

一、ARP Detection&#xff08;ARP检测&#xff09; ✅ 定义&#xff1a; ARP检测是一种防止ARP欺骗攻击的安全机制。它通过监控或验证网络中的ARP报文&#xff0c;来判断是否存在伪造的ARP信息。 &#x1f50d; 工作原理&#xff1a; 网络设备&#xff08;如交换机&#xf…

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真

基于 Python 的界面程序复现&#xff1a;标准干涉槽型设计计算及仿真 在工业设计与制造领域&#xff0c;刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序&#xff0c;旨在帮助工程师和…

Python绘制南丁格尔玫瑰图:从入门到实战

Python绘制南丁格尔玫瑰图&#xff1a;从入门到实战 引言 南丁格尔玫瑰图&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;也被称为极区图&#xff08;Polar Area Chart&#xff09;&#xff0c;是一种独特的数据可视化方式。这种图表由弗洛伦斯南丁格尔&#xff…

计算机操作系统概要

不谋万世者&#xff0c;不⾜谋⼀时。不谋全局者 &#xff0c;足谋⼀域 。 ——陈澹然《寤⾔》《迁都建藩议》 操作系统 一.对文件简单操作的常用基础指令 ls ls 选项 目录或⽂件名:罗列当前⽬录下的⽂件 -l&#xff1a;以长格式显示⽂件和⽬录的详细信息 -a 或 --all&…

<PLC><视觉><机器人>基于海康威视视觉检测和UR机械臂,如何实现N点标定?

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,相关设备如触摸屏(HMI)、交换机等工控产品,如果有…

从专家编码到神经网络学习:DTM 的符号操作新范式

1st author: Paul Soulos paper: Differentiable Tree Operations Promote Compositional Generalization ICML 2023 code: psoulos/dtm: Differentiable Tree Machine 1. 问题与思路 现代深度学习在连续向量空间中取得了巨大成功&#xff0c;然而在处理具有显式结构&#x…

微信小程序第三方代开发模式技术调研与实践总结

🚀 微信小程序第三方代开发模式技术调研与实践总结 📖 前言 随着企业对私有化品牌运营诉求的增加,许多大型客户希望将原本由 SaaS 平台统一提供的小程序迁移至自有主体(AppID)下运行,同时又希望继续沿用 SaaS 平台的业务服务与数据托管方式。微信开放平台提供的“小程…

开启智能未来:DeepSeek赋能行业变革之路

前言 在人工智能重构生产关系的2025年&#xff0c;DeepSeek以其革命性的推理能力和Python生态的技术延展性&#xff0c;正在重塑内容创作与数据智能的边界。本书以"工具迭代思维升维"为双轮驱动&#xff0c;构建从认知突破到商业落地的完整知识图谱。 DeepSeek的崛…

常见三维引擎坐标轴 webgl threejs cesium blender unity ue 左手坐标系、右手坐标系、坐标轴方向

平台 / 引擎坐标系类型Up&#xff08;上&#xff09;方向Forward&#xff08;前进&#xff09;方向前进方向依据说明Unity左手坐标系YZtransform.forward 是 Z 轴正方向&#xff0c;默认摄像机朝 Z 看。Unreal Engine左手坐标系ZXUE 的角色面朝 X&#xff0c;默认使用 GetActor…