发布于2026-07-21 阅读(0)
扫一扫,手机访问
getDeclaredField()这个反射方法,只负责从当前类自己声明的字段里找——父类里那些,它一概不认。即便是private字段,它也能拿到,不过想读写还得手动调用setAccessible(true)。字段名必须严格区分大小写,不支持继承查找,只要字段不存在,就会直接抛出NoSuchFieldException。

说白了,getDeclaredField() 就是让开发者拿到当前类自己定义的那些字段——无论访问权限是 public 还是 private,它都能暴露出来。但注意,它只查本类,不往上查父类,也不检查访问控制。不过默认情况下,拿到的 Field 对象还是不能直接读写,得配合 setAccessible(true) 才能绕过限制。
getDeclaredField(String name) 不会向上查找父类或接口中的字段,哪怕父类里有个同名的 private 字段,它也只会返回当前类中定义的那个(如果存在)。如果当前类根本没这个字段,那就直接抛出 NoSuchFieldException。
private 字段?没戏,即便同名也不行。private 字段(Ja va 9+ 虽然支持 private 方法,但字段仍然是 public static final)。val$x 这种。获取到 Field 对象后,它的 get() 和 set() 方法默认受 Ja va 访问控制限制。想操作 private 字段,必须显式跳过检查:
Field field = clazz.getDeclaredField("secret");
field.setAccessible(true); // 关键一步
Object value = field.get(instance);
field.set(instance, newValue);
setAccessible(true) 对同一个 Field 实例只需调用一次,后续操作不用重复。Ja va 字段名严格区分大小写,而且字段名里不包含任何修饰符信息。举个例子:
private String userName;,那么传入的字符串必须是 "userName",写成 "username" 或 "USERNAME" 都不行。@Data),字段名就是代码里写的那个名称,不是 getter/setter 的名字。$VALUES)也能通过这个方法拿到,但名字得去字节码里确认。如果不知道字段名,或者想批量处理本类所有 private 字段,可以用 getDeclaredFields():
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (Modifier.isPrivate(f.getModifiers())) {
f.setAccessible(true);
// 处理 f
}
}
getDeclaredFields() 返回当前类所有字段(public/protected/private/default),不包含继承来的字段。Modifier.isPrivate(int) 判断访问修饰符。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8