抛出 IllegalAccessException,因为 getDeclaredField() 成功获取 private 字段后,field.get(obj) 运行时访问控制检查失败;字段存在但无访问权限,且未调用 setAccessible(true) 解除限制。

会抛出 IllegalAccessException。
为什么是 IllegalAccessException 而不是其他异常
这个异常明确表示“访问被拒绝”,而不是“找不到字段”。只要通过 getDeclaredField() 成功拿到了 private 字段对象,说明字段存在、名称正确、类加载正常;但调用 field.get(obj) 时,JVM 会在运行时执行访问控制检查——由于字段是 private,且当前类与字段所在类无继承或包内关系,也未主动解除限制,就直接抛出 IllegalAccessException。
-
NoSuchFieldException:发生在getDeclaredField("xxx")阶段,字段名错、拼写错误、不在本类声明中(比如在父类却没递归查找) -
NullPointerException:传入的obj是null,而字段不是static -
InaccessibleObjectException:Java 9+ 模块环境下,字段所在模块未opens,即使调了setAccessible(true)也会升级为此异常(属于RuntimeException)
关键细节:异常触发时机很明确
异常不出现在获取 Field 对象时,只出现在真正读写操作那一刻:
-
field.get(obj)→ 抛IllegalAccessException(未设可访问) -
field.set(obj, value)→ 同样抛 -
field.get(null)对static private字段也一样
也就是说,getDeclaredField() 成功只是第一步,不等于能用。
通过 yarn-threads-cli 与 Threads(Meta)交互。当用户想要阅读首页动态、点赞、收藏的帖子或特定帖子时使用;查看...
立即学习“Java免费学习笔记(深入)”;
怎么验证它确实是 IllegalAccessException
写个最小复现:
class A { private String secret = "abc"; }
Field f = A.class.getDeclaredField("secret");
f.get(new A()); // 这里直接抛:java.lang.IllegalAccessException
堆栈里会清晰显示:
Class XXX can not access a member of class YYY with modifiers "private"不是加 try-catch 就能解决的问题
捕获 IllegalAccessException 并打印日志,下次调用还抛。根本解法是提前调用:
-
f.setAccessible(true);(必须在get()或set()之前) - 注意:对同一个
Field实例只需调一次,重复调无害也无必要 - 不要依赖
getField(),它根本查不到private字段

















