我正在使用一些注释来动态设置类中字段的值。由于我想执行此操作,而不管它是公共(public)的, protected 还是私有(private)的,因此每次调用setAccessible(true)
方法之前,我都会在Field对象上调用set()
。我的问题是setAccessible()
调用会对字段本身产生什么样的影响?
更具体地说,假设它是一个私有(private)字段,并且这组代码称为setAccessible(true)
。如果代码中的其他位置要通过反射来检索相同的字段,那么该字段是否已经可以访问?还是getDeclaredFields()
和getDeclaredField()
方法每次都返回Field对象的新实例?
我想说明问题的另一种方式是,如果我调用setAccessible(true)
,在完成后将其设置回原始值有多重要?
最佳答案
使用setAccessible()
可以更改AccessibleObject
的行为,即Field
实例,但不能更改类的实际字段。这是documentation(节选):
和一个可运行的示例:
public class FieldAccessible {
public static class MyClass {
private String theField;
}
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Field field1 = myClass.getClass().getDeclaredField("theField");
field1.setAccessible(true);
System.out.println(field1.get(myClass)); // no exception
Field field2 = myClass.getClass().getDeclaredField("theField");
System.out.println(field2.get(myClass)); // IllegalAccessException
}
}