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