Java反射-setAccessible(true)的影响

我正在使用一些注释来动态设置类中字段的值。由于我想执行此操作,而不管它是公共的,受保护的还是私有的,因此setAccessible(true)每次调用该set()方法之前,我都会在Field对象上进行调用。我的问题是,setAccessible()电话会议对该领域本身会产生什么样的影响?

更具体地说,假设它是一个私有字段,并且这组代码调用setAccessible(true)。如果代码中的其他位置要通过反射来检索相同的字段,那么该字段是否已经可以访问?还是getDeclaredFields()getDeclaredField()方法每次都返回Field对象的新实例?

我想说明问题的另一种方式是,如果我打电话setAccessible(true),完成后将其设置回原始值有多重要?

回答:

setAccessible()您更改的行为AccessibleObject,即Field实例,但不更改类的实际字段。这是文档(节选):

true表示使用该反射对象时,应禁止检查Java语言访问控制

和一个可运行的示例:

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

}

}

以上是 Java反射-setAccessible(true)的影响 的全部内容, 来源链接: utcz.com/qa/412245.html

回到顶部