Java 反射 - setAccessible(true) 的影响

2022-08-31 08:40:26

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

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

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


答案 1

更改 的行为,即实例,但不是类的实际字段。以下是文档(摘录):setAccessible()AccessibleObjectField

值 of 指示反射的对象在使用时应禁止检查 Java 语言访问控制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)); // no exception
        Field field2 = myClass.getClass().getDeclaredField("theField");
        System.out.println(field2.get(myClass)); // IllegalAccessException
    }

}

答案 2

该方法每次都必须返回一个新对象,正是因为此对象具有可变标志。因此,无需重置标志。您可以在此博客文章中找到完整的详细信息。getDeclaredFieldaccessible