我正在使用一些注释来动态设置类中字段的值。由于我想执行此操作,而不管它是公共(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
    }

}

10-08 08:48