我正在使用一些注释来动态设置类中字段的值。因为我希望这样做,而不管它是公共的、受保护的还是私有的,所以每次在调用set()
方法之前,我都会在Field对象上调用setAccessible(true)
。我的问题是,setAccessible()
调用对字段本身有什么样的影响?
更具体地说,假设它是一个私有字段,并且这组代码调用setAccessible(true)
。如果代码中的其他位置通过反射检索相同的字段,那么该字段是否已经可以访问?或者getDeclaredFields()
和getDeclaredField()
方法每次都会返回Field对象的新实例?
我猜另一种表述问题的方式是,如果我调用setAccessible(true)
,那么在调用完成后将其设置回原始值有多重要?
发布于 2012-05-17 23:41:10
getDeclaredField
方法每次都必须返回一个新对象,这正是因为该对象具有可变的accessible
标志。因此,不需要重置标志。你可以在this blog post上找到完整的细节。
发布于 2013-11-23 17:45:53
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));
}
}
https://stackoverflow.com/questions/10638826
复制相似问题