JDK11的checkSystemClipboardAccess替代方案是什么?

4

JDK11已从SecurityManager中删除了checkSystemClipboardAccess。在处理剪贴板时,建议使用什么替代语言习惯用法?

我想像这样检查剪贴板的可用性:

public static boolean hasClipboard() {
    SecurityManager sm = System.getSecurityManager();
    if (sm == null) return true;
    try {
        sm.checkSystemClipboardAccess();
        return true;
    } catch (SecurityException x) {
        /* */
    }
    return false;
}

但是在JDK11中无法编译它。

编辑 2020年01月02日:
根据建议,现在我正在使用:

public static boolean hasClipboard() {
    SecurityManager sm = System.getSecurityManager();
    if (sm == null) return true;
    try {
        sm.checkPermission(new AWTPermission("accessClipboard"));
        return true;
    } catch (SecurityException x) {
        /* */
    }
    return false;
}

2
JDK 8中的checkSystemClipboardAccess() Javadoc表明,"对AWTPermission的依赖会妨碍Java平台未来的模块化",因此使用java.awt.AWTPermission作为解决方法可能不是长期之计。Javadoc还表示,"在未来的版本中,将更改此方法以检查权限java.security.AllPermission"(这对我来说没有意义),但是没有看到任何其他来源对此进行澄清。 - skomisa
@skomisa 我认为手动使用 AWTPermission 是长期解决方案(答案中引用的文档似乎也是这样认为的)。你提到的引用与 JDK 本身 的模块化有关。如果 java.base 模块中的一个类需要 java.desktop 模块中的一个类,那么这将是一个问题,因为前者模块应该是,嗯,基础 模块。如果用户应用程序依赖于 java.desktop,那么这没问题,因为它可能也在使用 AWT 或 Swing。 - Slaw
2个回答

2
一个快速的解决方法是将您对 sm.checkSystemClipboardAccess(); 的调用替换为对 sm.checkPermission(new java.awt.AWTPermission("accessClipboard")); 的调用。
请参见 Oracle JDK 8 的技术说明文档 Java Development Kit (JDK) 中的权限,其中明确指出了 checkSystemClipboardAccess() 的弃用:

方法

public void checkSystemClipboardAccess(); 注意:此方法已过时;请改用 public void checkPermission(Permission perm);

权限

java.awt.AWTPermission "accessClipboard";


2
一次搜索关于“java checkSystemClipboardAccess removed”的[谷歌]链接指向了Oracle的javadoc,其中包含了类SecurityManager(JDK 10)的文档和方法checkSystemClipboardAccess()的文档,其中写道:
已弃用,将来可能会被移除:此API元素可能在将来的版本中被移除。这个方法最初用于检查调用线程是否能够访问系统剪贴板。该方法已经过时,代码应改为使用checkPermission(java.security.Permission)来检查AWTPermission("accessClipboard")。该方法可能会在Java SE的未来版本中被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接