Java反射& security:在整个类上禁用setAccessible

时间:2014-01-17 17:49:15

标签: java security reflection

问题很简单:我有一个带有一些私有属性的类,我想保证除非我提供方法,否则任何人都无法改变这些属性。

我需要一个多小时才能找到一个希望简单的答案,到目前为止我找不到任何结论。

让我们看看代码:

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的静态初始化程序,但如果不可能,那就没关系......

0 个答案:

没有答案