在 Java 中,private 成员(字段、方法、构造器)只能在定义它的类内部访问。但如果你“想从外部访问 private 成员”,常见有以下几种方式(按合规程度从正常到特殊):
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
✅ 这是最推荐的方式,符合封装原则。
class Secret {
private int code = 123;
public int getCode() {
return code;
}
}
class Outer {
private int x = 10;
class Inner {
void show() {
System.out.println(x); // ✅ 合法
}
}
}
import java.lang.reflect.Field;
class Demo {
private String secret = "hidden";
}
public class Test {
public static void main(String[] args) throws Exception {
Demo d = new Demo();
Field f = Demo.class.getDeclaredField("secret");
f.setAccessible(true); // 关键
System.out.println(f.get(d));
}
}
⚠️ 注意:
SecurityManager 或模块系统(JPMS)限制Method m = Demo.class.getDeclaredMethod("privateMethod");
m.setAccessible(true);
m.invoke(d);
org.springframework.test.util.ReflectionTestUtilsReflectionTestUtils.setField(obj, "fieldName", value);
❌ 直接改源码去掉 private
❌ 依赖编译器 hack
❌ 在生产代码中滥用反射
| 方式 | 是否推荐 |
|---|---|
| getter / setter | ✅ 强烈推荐 |
| 公共方法 | ✅ 推荐 |
| 内部类 | ✅ 可用 |
| 反射 | ⚠️ 特殊场景 |
| 直接改访问权限 | ❌ 不推荐 |
如果你能说明使用场景(测试?框架?调试?学习?),我可以给你更合适的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。