可以,Java 中的 private 成员是能被反射(Reflection)访问和修改的。
private 是编译期的访问权限限制,而反射是在运行期通过 JVM 直接操作类结构,绕过了编译器的访问检查。
class Person {
private String name = "Tom";
}
public class Test {
public static void main(String[] args) throws Exception {
Person p = new Person();
Class<?> clazz = p.getClass();
Field field = clazz.getDeclaredField("name");
// 关键:取消访问检查
field.setAccessible(true);
System.out.println(field.get(p)); // Tom
field.set(p, "Jerry");
System.out.println(field.get(p)); // Jerry
}
}
class Demo {
private void hello() {
System.out.println("private method");
}
}
public class Test {
public static void main(String[] args) throws Exception {
Demo d = new Demo();
Method m = Demo.class.getDeclaredMethod("hello");
m.setAccessible(true);
m.invoke(d);
}
}
setAccessible(true) 是必须的
IllegalAccessException模块化(Java 9+)限制
java.base 或其他强封装模块中,可能反射失败--add-opens java.base/java.lang=ALL-UNNAMED
安全管理器(SecurityManager)
框架中大量使用
private✅ private 能被反射
✅ 用 setAccessible(true) 即可
⚠️ 仅限运行期,不破坏语言语义
⚠️ 生产环境应谨慎使用
如果你想知道反射能否破坏单例 / 枚举 / final,也可以继续问。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。