问题很简单:我有一个带有一些私有属性的类,我想保证除非我提供方法,否则任何人都无法改变这些属性。
我需要一个多小时才能找到一个希望简单的答案,到目前为止我找不到任何结论。
让我们看看代码:
public final class MyObject {
private List<Integer> list = new ArrayList<Integer>(5);
public MyObject() {
for (int i = 1; i <= 5; i++) {
list.add(i);
}
}
public List<Integer> toList() {
return new ArrayList<>(list);
}
}
现在,我想要这样的东西:
void test() throws Exception {
MyObject mo = new MyObject();
Field f = mo.getClass().getDeclaredField("list");
f.setAccessible(true);
List<Integer> myList = (List<Integer>) f.get(mo);
myList.add(100);
}
总是在所有线程中对MyObject的所有实例都失败(在setAccessible(true)调用上)。
我正在使用反射并修改其他类的一些私有字段,所以我不能只为整个程序关闭该功能。
我也希望有一些自包含的内容,我可以放入MyObject的静态初始化程序,但如果不可能,那就没关系......