繁体   English   中英

如何等待反射线程完成

[英]How to wait for a reflection thread to finish

我有一个应用程序类,该类允许用户下载一个jar文件,然后使用反射访问该jar文件。

public void install() {
    File app = new File("C:/Temp/" + this.name + ".jar");
    if(!app.exists())
        download();

    URLClassLoader appLoader;
    Class<?> appBuilder = null;

    try {
        appLoader = URLClassLoader.newInstance(new URL[] { new URL("C:/Temp/" + this.name + ".jar") });
        appBuilder = appLoader.loadClass("iezon.app.App");
    } catch (MalformedURLException | ClassNotFoundException e) {
        WebSocket.addError(e);
    }

    this.application = appBuilder;
}

private void download() {
    try {
        FileUtils.copyURLToFile(new URL(this.downloadUrl), new File("C:/Temp/" + this.name + ".jar"));
    } catch (IOException e) {
        WebSocket.addError(e);
    }
}

在这里,我正在创建jar文件的新实例:

public void start() {
    try {
        App.createWindow(this.application.getClass());
    } catch (InstantiationException | IllegalAccessException e) {
        WebSocket.addError(e);
    }
}

Window是JFrame的自定义扩展,用作GUI设计的基本模板。

public static int createWindow(Class<?> window) throws InstantiationException, IllegalAccessException {
    factory.add((Window) window.newInstance());
    factory.get(factory.size() - 1).windowId = factory.size() - 1;
    factory.get(factory.size() - 1).run();
    return factory.size() - 1;
}

由于jar文件一旦实例化,就无法访​​问此代码以在退出时加载主屏幕窗口,我想知道如何等待jar文件实例关闭然后重新启动主屏幕:

即在suedo代码中:

when (create App.createWindow(this.application.getClass()))
dies
create App.createWindow(HomeScreen.class)

有没有一种方法可以使用wait()notify()方法? 或者在实例化类(例如factory.get(factory.size() - 1).addSomeExitListener.....()时添加侦听器?

您可能会忘记反射部分,它并不是真正相关的,因为如果为您提供一个定期构造的实例,那也是正确的。

您需要以一种可以按需工作的方式设计Window类,例如,完成后让其回调您。 由于它是一个JFrame您也可以使用它的窗口关闭侦听器,例如:

public static int createWindow(Class<?> window) throws InstantiationException, IllegalAccessException {
    Window instance = (Window) window.newInstance();
    factory.add(instance);
    instance.windowId = factory.size() - 1;
    if (window != HomeScreen.class) {
        // instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // ?
        instance.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                App.createWindow(HomeScreen.class);
            }
        });
    }
    instance.run();
    return factory.size() - 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM