我正在尝试了解java安全性和AccessController.doPrivileged()用法的基础知识我从一个示例程序开始
import java.security.AccessController;
import java.security.PrivilegedAction;
public class AccessSystemProperty {
public static void main(String[] args) {
System.out.println(System.getSecurityManager());
AccessController.doPrivileged(
new PrivilegedAction<Boolean>(){
public Boolean run(){
System.out.println(System.getProperty("java.home"));
return Boolean.TRUE;
}
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用默认安全管理运行上面的代码我得到AccessControlException我的stacktrace是
C:\>java -Djava.security.manager AccessSystemProperty
java.lang.SecurityManager@923e30
Exception in thread "main" java.security.AccessControlException: access denied (
java.util.PropertyPermission java.home read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at AccessSystemProperty$1.run(AccessSystemProperty.java:9)
at AccessSystemProperty$1.run(AccessSystemProperty.java:8)
at java.security.AccessController.doPrivileged(Native Method)
at AccessSystemProperty.main(AccessSystemProperty.java:6)
Run Code Online (Sandbox Code Playgroud)
请帮助我清楚地了解一下
1)什么时候需要使用AccessController.doPrivileged()?(如果存在SecurityManager,我们使用AccessController.doPrivileged - 为什么这在上面的示例中失败)
2)使用AccessController和PrivilegedAction获得的真正优势是什么?
3)我们是否需要上述示例的自定义策略文件才能工作?
谢谢,
保罗
为什么HashMap合并正在对值进行空值检查.HashMap支持null键和null值.所以有人可以告诉为什么需要对合并进行null检查?
@Override
public V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
if (value == null)
throw new NullPointerException();
if (remappingFunction == null)
throw new NullPointerException();
Run Code Online (Sandbox Code Playgroud)
由于这个原因,我无法Collectors.toMap(Function.identity(), this::get)用于收集地图中的值