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