[英]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.