Java中的反射

反射的基本概念

反射是指在程序运行时动态获取类型信息并操作对象的能力。通过反射,可以检查类、接口、字段和方法,甚至在运行时调用方法或修改字段值。反射常用于框架设计、动态代理、依赖注入等场景。


生活类比

  • 正常写代码 :你提前知道 有个类 Person,直接 new Person() 调用。

  • 反射 :你运行时 才拿到一个 .class 文件,不知道类名,但你能:

    • 查出它叫啥、有哪些方法、哪些字段

    • 临时创建它的对象

    • 调用它的私有方法/字段(破封装)

反射的常见操作

获取Class对象(三种方式)
java 复制代码
// 通过包名+类名获取
Class<?> clazz1 = Class.forName("java.lang.Student");//括号里面是全类名

// 通过类名获取
Class<?> clazz2 = Student.class;

// 通过对象获取
Student s=new Student();
Class<?> clazz3 =s.getClass;
 

反射中获取构造方法

获取构造方法的基本步骤

通过反射获取类的构造方法,需要使用Class类的getConstructors()或getDeclaredConstructors()方法。前者返回所有公共构造方法,后者返回所有声明的构造方法(包括私有构造方法)。

java 复制代码
Class<?> clazz = MyClass.class;
Constructor<?>[] publicConstructors = clazz.getConstructors();
Constructor<?>[] allConstructors = clazz.getDeclaredConstructors();
 

获取特定参数的构造方法

如果需要获取带有特定参数类型的构造方法,可以使用getConstructor()或getDeclaredConstructor()方法。参数类型以Class对象数组的形式传入。

java 复制代码
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
 

访问私有构造方法

私有构造方法无法直接通过getConstructor()获取,需要使用getDeclaredConstructor()并调用setAccessible(true)来绕过访问限制。

java 复制代码
Constructor<?> privateConstructor = clazz.getDeclaredConstructor();
privateConstructor.setAccessible(true);
Object instance = privateConstructor.newInstance();
 

反射获取成员变量

反射获取成员变量

获取所有成员变量

使用Class.getDeclaredFields()方法可以获取类中声明的所有成员变量(包括私有变量,但不包括继承的变量):

java 复制代码
Class<?> clazz = MyClass.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field.getName());
}
 
获取指定成员变量

通过Class.getDeclaredField(String name)可以获取指定名称的成员变量:

java 复制代码
Field field = clazz.getDeclaredField("fieldName");
 
获取公有成员变量

使用Class.getFields()可以获取所有公有成员变量(包括继承的):

java 复制代码
Field[] publicFields = clazz.getFields();
 
访问私有成员变量

要访问私有成员变量,需要先调用Field.setAccessible(true):

java 复制代码
Field privateField = clazz.getDeclaredField("privateField");
privateField.setAccessible(true);
Object value = privateField.get(instance);
 

反射的作用

1.获取类里面的信息

2.跟配置文件结合,动态的创建对象,并调用方法

相关推荐
星夜离尘561 小时前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
_Evan_Yao1 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
Ai-_Man1 小时前
Meta Muse还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·c#·1024程序员节
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼1 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
学逆向的2 小时前
C 枚举变量
c语言·开发语言·网络安全
Sakura_j_h_2 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
thefool1122662 小时前
TCP 1
java·1024程序员节
金銀銅鐵5 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手5 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务