为什么允许通过反射访问 Java 私有字段?

2022-09-01 00:21:14

考虑这个例子:

import java.lang.reflect.Field;

public class Test {

    public static void main(String[] args) {
        C c = new C();
        try {
            Field f = C.class.getDeclaredField("a");
            f.setAccessible(true);
            Integer i = (Integer)f.get(c);
            System.out.println(i);
        } catch (Exception e) {}
    }
}

class C {
    private Integer a =6;
}

允许您通过反射访问类的私有字段似乎是不合逻辑的。为什么这样的功能可用?允许这种访问不是“危险”吗?


答案 1

私有旨在防止意外误用,而不是作为一种安全机制。如果您选择绕过它,那么您可以自行承担风险,并假设您知道自己在做什么。


答案 2

两者实际上都由安全管理器检查,并且当您的代码不允许这样做时,将引发异常。通常你不会注意到它,因为Java代码通常在没有安全管理器的情况下运行。getDeclaredField()setAccessible()

一个重要的例外是小程序,它总是与安全管理器一起运行。