java AccessController.doPrivileged

    在各种开源框架中,都会存在使用AccessController.doPrivileged方法的代码,代码形式如下:

            CACHE_SIZE = AccessController.doPrivileged(
                    new PrivilegedAction() {
                    @Override
                    public Integer run() {
                        return Integer.valueOf(
                                System.getProperty(CACHE_SIZE_PROP, "1000"));
                    }
                }).intValue();

    对于上面的代码,直接调用System.getProperty和通过AccessController.doPrivileged来调用有什么区别呢?先看一下JDK API说明,如下:

启用特权,执行指定的 PrivilegedAction。该操作在调用者保护域所拥有的全部 权限下执行。
如果该操作的 run 方法抛出(未经过检查的)异常,则该异常将通过此方法传播。
注意,执行该操作时,任何与当前 AccessControlContext 关联的 DomainCombiner 都将被忽略。

    在看一下System.getProperty这个方法的实现,如下:

    public static String getProperty(String key, String def) {
    checkKey(key);
    SecurityManager sm = getSecurityManager();
            if (sm != null) {
        sm.checkPropertyAccess(key);
    }
    return props.getProperty(key, def);
    }