什么是Java 9+;等效于从AppContext中删除类;需要重新加载PrintServiceLookup类

什么是Java 9+;等效于从AppContext中删除类;需要重新加载PrintServiceLookup类,java,printing,classloader,java-9,Java,Printing,Classloader,Java 9,我已将较旧的打印机API代码迁移到Java 8,并出现以下警告: 访问限制:方法“AppContext.getAppContext()”不是API(对所需库“C:\Program Files\Java\jre1.8.0\U 51\lib\rt.jar”的限制) 这是由于该代码(最初来源于): /** *打印机列表不会自动刷新;如有必要,需要运行此刷新。 */ 公共静态无效刷新SystemPrinterList(){ Class[]classes=PrintServiceLookup.Class.

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

访问限制:方法“AppContext.getAppContext()”不是API(对所需库“C:\Program Files\Java\jre1.8.0\U 51\lib\rt.jar”的限制)

这是由于该代码(最初来源于):

/**
*打印机列表不会自动刷新;如有必要,需要运行此刷新。
*/
公共静态无效刷新SystemPrinterList(){
Class[]classes=PrintServiceLookup.Class.getDeclaredClasses();
for(int i=0;i
据我所知,
PrintServiceLookup
在类加载时加载一个可见打印机列表,但它显然不会刷新此列表,或者具有触发刷新的功能。长时间运行的应用程序刷新列表的方法是卸载类(代码就是这样做的),或者重新启动自身

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

最后,我想知道我需要做些什么来正确地替换它。目前在Windows上运行,可能正在迁移到Linux;我看到了很多关于Linux实现的更新。

(的唯一具体实现提供了一个线程来执行此操作

它无限循环检查更改,如果有更改,则调用
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
没有指示某些内容已更改。这是一种本机方法,因此实现将取决于您的操作系统


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

您想替换它还是只关心支持Java 9?您可以通过添加此命令行选项来支持它,而无需更改任何内容。
--add exports=Java.desktop/sun.awt=ALL-UNNAMED
@Michael当然,此选项只在该类存在的情况下有效……事实上,OP没有承认存在此问题一点也不。他只是在迁移代码,其中包含一个解决问题的方法。@Michael-什么包是
PrintServiceLookupProvider
class?@JoshDM
javax.print
@JoshDM oh对不起。提供商是
sun.print
Thread thr = new Thread(null, new PrinterChangeListener(), "PrinterListener", 0, false);
thr.setDaemon(true);
thr.start();