在 Java 中,private 字段可以通过反射(Reflection)访问和修改,核心是使用
Class.getDeclaredField(...) + setAccessible(true)。
下面从获取、读取、修改、注意事项几个方面说明。
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception {
User user = new User("Tom", 18);
// 获取 Class 对象
Class<?> clazz = user.getClass();
// 获取 private 字段
Field nameField = clazz.getDeclaredField("name");
// 解除私有限制(关键步骤)
nameField.setAccessible(true);
// 读取字段值
String nameValue = (String) nameField.get(user);
System.out.println(nameValue); // Tom
// 修改字段值
nameField.set(user, "Jerry");
System.out.println(nameField.get(user)); // Jerry
}
}
class Config {
private static int version = 1;
}
Field field = Config.class.getDeclaredField("version");
field.setAccessible(true);
int v = (int) field.get(null); // static 字段,get 传 null
System.out.println(v);
field.set(null, 2);
| 方法 | 说明 |
|---|---|
getDeclaredField(name) |
获取本类声明的字段(含 private) |
getField(name) |
只能获取 public 字段 |
setAccessible(true) |
取消 Java 语言访问检查 |
get(obj) |
获取字段值 |
set(obj, value) |
设置字段值 |
final 字段可以反射修改,但不推荐,可能导致未定义行为。
Field field = obj.getClass().getDeclaredField("id");
field.setAccessible(true);
field.set(obj, 999);
⚠️ 注意:
如果你在 Java 9+ 中反射访问 JDK 或模块内 private 字段,可能会看到:
InaccessibleObjectException
解决方式(不推荐生产使用):
--add-opens java.base/java.lang=ALL-UNNAMED
✅ Java private 字段反射三步走:
Field field = clazz.getDeclaredField("fieldName");
field.setAccessible(true);
field.get(obj) / field.set(obj, value);
如果你有具体场景(如 Spring、Android、Kotlin、序列化、框架源码),我可以给你更贴近实战的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。