如何解决通过反射调用main时,JVM退出且窗口可见
Mac OS X Catalina
JDK OpenJDK 14.0.2(相同版本14.0.1)
public class PriceUpdateForm extends JPanel {
/* lots of code omitted */
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> startGUI());
/* try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
System.exit(17);
} */
}
private static void startGUI() {
final var form = new PriceUpdateForm();
form.j = new JFrame();
form.j.getContentPane().add(form);
form.j.pack();
form.j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
form.j.setVisible(true);
}
}
直接从命令行(或IntelliJ)调用此类的main
方法时,即使睡眠被注释掉,它也能按预期工作。在您单击关闭按钮之前,该窗口一直保持可见状态,然后程序退出。
相反,当我使用蹦床模式(其中类名是第一个参数,如下所示)时,即使窗口可见,JVM也愿意退出。当窗口立即消失时,我很难调试它,但是如果您取消注释睡眠,则JVM将在3秒钟后退出,并且直到那时窗口都是清晰可见的。
蹦床主要方法摘录
final Class<?> mainClass = Class.forName(args[0]);
final Method mainMethod = mainClass.getDeclaredMethod("main",newArgs.getClass());
mainMethod.invoke(null,new Object[]{newArgs});
newargs
只是原始参数减去零。
我得到了不睡觉的声音,PriceUpdateForm.main
将会退出,但是我不明白为什么它会将Window推倒。那是在GUI线程上创建的。 不是超出范围,或者至少,无论main
的调用方式如何,其范围都应该相同:直接还是通过反射。
有人可以解释这种行为差异吗?我想我可以做长达sleep
年的事情,但这看起来很丑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。