通过反射调用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 (将#修改为@)