反射机制
之前学过一部分,笔记在20250103Java包_网络编程.md里,这里在之前的笔记的基础上做一些补充。
-
反射:得到class对象后反向获取对象的各种信息。
-
包
- Field 类或接口中的字段(成员变量),动态访问和修改类的字段
-
模板
-
获取Class 对象 .forName Class<?> clazz = Class.forName(“ReflectClass”);
-
获取
- 用Class类获取方法
- 获取构造方法**.getConstructor** Constructor<?> constructor = clazz.getConstructor(Class1.class, Class2.class);
- 获取成员方法**.getMethod** Method method = clazz.getMethod(“methodName”, ParamType1.class, ParamType2.class);
- 用Filed获取静态属性,例如成员变量属性 .getField Field staticField = clazz.getField(“staticFieldName”);
- 用Class类获取方法
-
查询或修改
- 构造方法实例化 .newInstance(" "); Object instance = constructor.newInstance(arg1, arg2);
- 设置成员变量值 set(instance,“UP”); field.set(instance, value);
- 调用成员方法 invoke(instance,“reflect”); Object result = method.invoke(instance, arg1, arg2);
- 获取静态属性 .get Object staticFieldValue = staticField.get(null);
-
模板
import java.lang.reflect.*;
public class ReflectionTemplate {
public static void main(String[] args) throws Exception {
// 1. 获取 Class 对象
Class<?> clazz = Class.forName("YourClassName"); // 替换为实际类名
// 2. 获取构造方法并实例化对象
Constructor<?> constructor = clazz.getConstructor(Class1.class, Class2.class); // 替换参数类型
Object instance = constructor.newInstance(arg1, arg2); // 替换实际参数
// 3. 获取静态属性
Field staticField = clazz.getField("staticFieldName"); // 替换字段名
Object staticFieldValue = staticField.get(null); // 获取静态属性值(null 表示静态字段)
// 4. 设置成员变量值
Field field = clazz.getField("fieldName"); // 替换字段名
field.set(instance, value); // 设置对象字段值
// 5. 获取成员方法并调用
Method method = clazz.getMethod("methodName", ParamType1.class, ParamType2.class); // 替换方法名和参数类型
Object result = method.invoke(instance, arg1, arg2); // 替换实际参数
}
}
反射能做什么
-
动态加载类和实例化对象
-
动态调用方法
-
操作(修改和访问)字段
-
序列化与反序列化
- 序列化,将对象的状态转换为可存储或传输的字节流
- 反序列化,从字节流恢复对象,在反序列化过程中可以帮助实例化对象,即使我们不知道类