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)); } }