反思中特权区块的需求是什么?

Tap*_*ose 5 java reflection privileges

我已经看到代码通过在Privilege块中执行的Reflection获取字段值.以下代码取自ReflectionUtil:

public static <T> T accessDeclaredField(final Field f, final Object o, final Class<T> responseClass) {
    return AccessController.doPrivileged(new PrivilegedAction<T>() {
        public T run() {
            boolean b = f.isAccessible();
            try {
                f.setAccessible(true);
                return responseClass.cast(f.get(o));
            } catch (SecurityException e) {
                return null;
            } catch (IllegalAccessException e) {
                return null;
            } finally {
                f.setAccessible(b);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我不明白在特权块中获取字段值的原因; 我们可以不用它来做到这一点.

它是更好的编码实践还是我们获得额外的东西?

参考:特权块的API

Mar*_*nik 8

如果没有安装的安全管理器,则不需要特权块.但是,如果您正在编写完全通用的库代码(可能是使用安全管理器执行的,并且库的调用者可能没有所需的权限),那么PrivilegedAction即使没有您的代码也将被拒绝访问,即使代码本身(其CodeSource)确实拥有权限.