Javareflection – setAccessible的影响(true)

我正在使用一些注释来dynamic设置类中字段的值。 因为我想这样做,无论它是公共的,保护的还是私人的,我每次在调用set()方法之前都要在Field对象上调用setAccessible(true) 。 我的问题是setAccessible()调用对字段本身有什么样的影响?

更具体地说,这是一个私人领域,这组代码调用setAccessible(true) 。 如果代码中的其他地方然后通过reflection来检索相同的字段,该字段是否可以被访问? 或者getDeclaredFields()getDeclaredField()方法每次都返回一个Field对象的新实例?

我想另外一个说明这个问题的方法是,如果我调用setAccessible(true) ,在完成之后将它设置回原始值有多重要?

你为什么不尝试自己;-)

 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)); Field field2 = myClass.getClass().getDeclaredField("theField"); System.out.println(field2.get(myClass)); } } 

所以要回答你的问题:用setAccessible()你改变AccessibleObject的行为,即Field实例,但不是类的实际字段。 这里是文档 (摘录):

值为true表示reflection对象在使用时应该禁止Java语言访问检查

getDeclaredField方法每次都必须返回一个新的对象,因为这个对象有可变的accessible标志。 所以没有必要重新设置标志。 你可以在这个博客文章中find完整的细节。

 import java.lang.reflect.Field; import java.lang.reflect.Method; public class PrivateVariableAcc { public static void main(String[] args) throws Exception { PrivateVarTest myClass = new PrivateVarTest(); Field field1 = myClass.getClass().getDeclaredField("a"); field1.setAccessible(true); System.out.println("This is access the private field-" + field1.get(myClass)); Method mm = myClass.getClass().getDeclaredMethod("getA"); mm.setAccessible(true); System.out.println("This is calling the private method-" + mm.invoke(myClass, null)); } }