AccessController.doPrivileged

2022-09-02 03:43:18

我试图弄清楚一些遗留代码在做什么。这条线到底在做什么,为什么我需要这样?

String lineSeparator = (String) java.security.AccessController.doPrivileged(
       new sun.security.action.GetPropertyAction("line.separator")); 

我在 Weblogic 8 上运行的 web/ejb 应用程序的记录器实现中发现了它。据我所知,没有启用任何特殊的安全策略。(我不喜欢从sun.*包中导入,所以我想摆脱这行;-)


答案 1

它只是获取一个系统属性。检索系统属性需要调用代码可能不具有的权限。断言调用类的特权,而不考虑调用类的调用方式。显然,这是您需要小心的事情。doPrivilegeddoPrivileged

引用的代码等效于:

String lineSeparator = java.security.AccessController.doPrivileged(
    new java.security.PrivilegedAction<String>() {
        public String run() {
            return System.getProperty("line.separator");
        }
    }
 );

(你不就是喜欢Java语法的简洁性吗?

在不主张特权的情况下,这可以重写为:

String lineSeparator = System.getProperty("line.separator");

答案 2