可以,Java 中的 private 字段、方法、构造器是可以通过反射访问的,只是“默认不可直接访问”,需要显式突破限制。
private 是 Java 语言的访问权限控制,作用在编译期和普通调用期。
而 反射(Reflection) 是在 JVM 运行期 操作类结构的机制,JVM 本身并不强制限制反射访问 private 成员,只是 AccessibleObject 默认会做安全检查。
class User {
private String name = "Tom";
}
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
User user = new User();
Field field = User.class.getDeclaredField("name");
field.setAccessible(true); // 关键:取消访问检查
System.out.println(field.get(user)); // Tom
}
}
✅ setAccessible(true) 就是“绕过 private 检查”的开关
class User {
private void say() {
System.out.println("hello");
}
}
Method method = User.class.getDeclaredMethod("say");
method.setAccessible(true);
method.invoke(user);
Constructor<User> constructor =
User.class.getDeclaredConstructor();
constructor.setAccessible(true);
User user = constructor.newInstance();
System.setSecurityManager(new SecurityManager());
某些环境(如早期 Applet、企业容器)可能禁止 setAccessible(true)
如果类在 强封装模块(module) 中:
module com.example {
exports com.example.api;
}
未 opens 的包,反射 private 会失败:
InaccessibleObjectException
解决方式(仅限自己可控环境):
--add-opens java.base/java.lang=ALL-UNNAMED
✅ 合理使用:
⚠️ 不推荐:
private 只是“语言级建议”,不是 JVM 级铁律;反射 +
setAccessible(true)可以访问,但是否允许,取决于运行环境和模块规则。
如果你愿意,我可以给你讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。