【Java 反射机制】
·
Java 反射机制
反射的核心类
| 类名 | 作用 |
|---|---|
| Class | 代表类的元数据 |
| Field | 代表类的成员变量 |
| Method | 代表类的方法 |
| Constructor | 代表类的构造方法 |
| Array | 提供动态创建和访问数组的方法 |
获取 Class 对象的三种方式
// 1. 通过类名.class
Class<?> clazz1 = String.class;
// 2. 通过对象.getClass()
String str = "Hello";
Class<?> clazz2 = str.getClass();
// 3. 通过Class.forName()
Class<?> clazz3 = Class.forName("java.lang.String");
反射的基本操作
创建对象
// 通过无参构造方法创建实例
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance(); // 已废弃,推荐使用下面的方式
// 通过有参构造方法创建实例
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("张三", 25);
访问字段
public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// 1. 创建测试对象
User user = new User("张三", 20);
// 2. 获取Class对象
Class<?> clazz = user.getClass();
// 3. 操作public字段
Field publicField = clazz.getField("name");
Object nameValue = publicField.get(user);
System.out.println("反射获取name: " + nameValue);// 反射获取name: 张三
publicField.set(user, "李四");
System.out.println("修改name后: " + user);// 修改name后: User(name=李四, age=20)
// 4. 操作private字段
Field privateField = clazz.getDeclaredField("age");
privateField.setAccessible(true); // 解除private限制
Object ageValue = privateField.get(user);
System.out.println("反射获取age: " + ageValue);// 反射获取age: 20
privateField.set(user, 30);
System.out.println("修改age后: " + user);// 修改age后: User(name=李四, age=30)
// 获取public方法
Method publicMethod = clazz.getMethod("setName", String.class);
// 调用方法
publicMethod.invoke(user, "王二狗");
System.out.println("调用setName后: " + user);// 调用setName后: User(name=王二狗, age=30)
// ================== 调用private方法 ==================
// 获取private方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
// 解除private限制
privateMethod.setAccessible(true);
// 调用方法
privateMethod.invoke(user);
}
}
@Data
@AllArgsConstructor
// 可序列化的User类
public class User implements Serializable {
public String name; // public字段
private int age; // private字段
}
反射可以绕过泛型检查:
List<String> list = new ArrayList<>();
list.add("hello");
Method addMethod = list.getClass().getMethod("add", Object.class);
addMethod.invoke(list, 100); // 绕过了泛型检查
System.out.println(list); // 输出: [hello, 100] (包含String和Integer)
更多推荐



所有评论(0)