Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待反射线程完成_Java_Reflection - Fatal编程技术网

Java 如何等待反射线程完成

Java 如何等待反射线程完成,java,reflection,Java,Reflection,我有一个应用程序类,它允许用户下载一个jar文件,然后使用反射访问这个jar文件 public void install() { File app = new File("C:/Temp/" + this.name + ".jar"); if(!app.exists()) download(); URLClassLoader appLoader; Class<?> appBuilder = null; try {

我有一个应用程序类,它允许用户下载一个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);
    }
}
窗口是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;
}

有什么方法可以使用
wait()
notify()
方法吗?或者可能在实例化类时添加一个侦听器,如
factory.get(factory.size()-1).addSomeExitListener…..()

您可以忘记反射部分,它并不真正相关,因为如果您有一个规则构造的实例,同样的情况也会发生

你需要设计你的
窗口
类,让它按你所希望的方式工作,例如,让它在完成后回调你。由于它是一个
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;
}
publicstaticintcreatewindow(类窗口)抛出实例化异常,IllegalAccessException{
Window实例=(Window)Window.newInstance();
添加(实例);
instance.windowId=factory.size()-1;
如果(窗口!=主屏幕.class){
//instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);/?
addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
应用程序.createWindow(主屏幕.class);
}
});
}
instance.run();
返回工厂。大小()-1;
}

您可以忘记反射部分,它实际上并不相关,因为如果给您一个定期构造的实例,情况也是如此

你需要设计你的
窗口
类,让它按你所希望的方式工作,例如,让它在完成后回调你。由于它是一个
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;
}
publicstaticintcreatewindow(类窗口)抛出实例化异常,IllegalAccessException{
Window实例=(Window)Window.newInstance();
添加(实例);
instance.windowId=factory.size()-1;
如果(窗口!=主屏幕.class){
//instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);/?
addWindowListener(新的WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
应用程序.createWindow(主屏幕.class);
}
});
}
instance.run();
返回工厂。大小()-1;
}
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;
}