gpt4 book ai didi

java - 从 AppContext 中删除类的 Java 9+ 等效项是什么?需要重新加载PrintServiceLookup类

转载 作者:行者123 更新时间:2023-12-02 08:51:04 24 4
gpt4 key购买 nike

我将旧的打印机 API 代码迁移到 Java 8,并出现以下警告:

Access restriction: The method 'AppContext.getAppContext()' is not API (restriction on required library 'C:\Program Files\Java\jre1.8.0_51\lib\rt.jar')

这是由于这段代码(最初源自this SO question):

/**
* Printer list does not refresh itself; need to run this to refresh if necessary.
*/
public static void refreshSystemPrinterList() {

Class[] classes = PrintServiceLookup.class.getDeclaredClasses();

for (int i = 0; i < classes.length; i++) {

if ("javax.print.PrintServiceLookup$Services".equals(classes[i].getName())) {

AppContext.getAppContext().remove(classes[i]); // the line that throws the warning
break;
}
}

据我了解,PrintServiceLookup在类加载时加载可见打印机列表,但它显然不会刷新此列表,或者能够触发刷新。长时间运行的应用程序刷新列表的方法是卸载类(这就是代码正在执行的操作),或者重新启动自身。

对警告的温和研究表明,在 Java 9 中,AppContext.getAppContext() 将无法访问。在没有进一步研究的情况下,我目前的补救想法是使用可访问的类加载器来加载此类,并在调用此方法时清除类加载器。

最终,我想知道我需要做什么才能正确替换它。目前在 Windows 上运行,可能会迁移到 Linux ;我看到 this SO question 有很多更新关于 Linux 实现。

最佳答案

PrintServiceLookupProvider (PrintServiceLookup 的唯一具体实现提供了一个应该执行此操作的线程。

它无限循环地检查更改,如果有更改,则调用 refreshServices

class PrinterChangeListener implements Runnable {
long chgObj;
PrinterChangeListener() {
chgObj = notifyFirstPrinterChange(null);
}

@Override
public void run() {
if (chgObj != -1) {
while (true) {
// wait for configuration to change
if (notifyPrinterChange(chgObj) != 0) {
try {
refreshServices();
} catch (SecurityException se) {
break;
}
} else {
notifyClosePrinterChange(chgObj);
break;
}
}
}
}
}

从这里开始:

Thread thr = new Thread(null, new PrinterChangeListener(), "PrinterListener", 0, false);
thr.setDaemon(true);
thr.start();

如果您遇到此功能不起作用的问题,您应该调查为什么 notifyPrinterChange 没有指示某些内容发生了更改。这是一种 native 方法,因此实现取决于您的操作系统。

不幸的是,您甚至无法使用反射来手动调用 refreshServices,因为 Sun 模块上的反射受到限制(您可以覆盖它,但如果您这样做,那么您也可以覆盖 AppContext)

关于java - 从 AppContext 中删除类的 Java 9+ 等效项是什么?需要重新加载PrintServiceLookup类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com