通过Field类获取属性并调用setAccessible(true)可操作私有字段,使用get()和set()读写值,需处理异常。

Java反射调用指定属性主要通过 java.lang.reflect.Field 类实现。你可以获取私有或公有字段,并读取或修改其值,即使字段是私有的也可以操作,前提是关闭访问检查。
1. 获取指定属性(Field)
使用 Class 对象的 getField() 或 getDeclaredField() 方法来获取属性对象:
- getField(String name):只能获取公共(public)属性,包括继承的。
- getDeclaredField(String name):获取本类中声明的任意访问级别的属性(包括 private),但不包括继承的。
Class> clazz = Person.class;
Field nameField = clazz.getDeclaredField("name"); // 获取私有字段 name
2. 访问私有属性(设置可访问)
如果属性是 private,需要调用 setAccessible(true) 来关闭访问安全检查。
nameField.setAccessible(true);
3. 读取和修改属性值
通过 Field 提供的 get() 和 set() 方法操作实例的属性值:
立即学习“Java免费学习笔记(深入)”;
- get(Object obj):获取 obj 实例中该字段的值。
- set(Object obj, Object value):为 obj 实例的该字段赋值。
Person person = new Person(); nameField.set(person, "张三"); // 设置字段值 Object value = nameField.get(person); // 获取字段值 System.out.println(value); // 输出:张三
完整示例
假设有一个 Person 类:
class Person {
private String name;
public Person() {}
}
使用反射设置并读取 name 属性:
Person person = new Person();
Class> clazz = person.getClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(person, "李四");
System.out.println(field.get(person)); // 输出:李四
基本上就这些。只要拿到 Field 对象,控制访问权限,就可以自由读写属性值,不受 private 限制。注意处理 NoSuchFieldException 和 IllegalAccessException 异常。不复杂但容易忽略 setAccessible。











