Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 当反射调用main时,JVM退出,窗口可见_Java_Swing_Jvm_Swingworker - Fatal编程技术网

Java 当反射调用main时,JVM退出,窗口可见

Java 当反射调用main时,JVM退出,窗口可见,java,swing,jvm,swingworker,Java,Swing,Jvm,Swingworker,MacOSXCatalina JDK OpenJDK 14.0.2(同一版本14.0.1) 当这个类的main方法直接从命令行(或IntelliJ)调用时,它会按预期工作,即使sleep被注释掉了。该窗口将一直可见,直到单击“关闭”按钮,然后程序退出 相反,当我使用trampoline模式时,类名是第一个参数,如下所示,JVM甚至愿意在窗口可见的情况下退出。当窗口立即消失时,我很难调试它,但是如果取消对睡眠的注释,JVM将在3秒钟后退出,直到那时窗口才清晰可见 摘自蹦床的主要方法

MacOSXCatalina

JDK OpenJDK 14.0.2(同一版本14.0.1)

当这个类的
main
方法直接从命令行(或IntelliJ)调用时,它会按预期工作,即使sleep被注释掉了。该窗口将一直可见,直到单击“关闭”按钮,然后程序退出

相反,当我使用trampoline模式时,类名是第一个参数,如下所示,JVM甚至愿意在窗口可见的情况下退出。当窗口立即消失时,我很难调试它,但是如果取消对睡眠的注释,JVM将在3秒钟后退出,直到那时窗口才清晰可见

摘自蹦床的主要方法

            final Class<?> mainClass = Class.forName(args[0]);
            final Method mainMethod = mainClass.getDeclaredMethod("main", newArgs.getClass());
            mainMethod.invoke(null, new Object[]{newArgs});
final Class mainClass=Class.forName(args[0]);
final方法mainMethod=mainClass.getDeclaredMethod(“main”,newArgs.getClass());
调用(null,新对象[]{newArgs});
newargs
只是原始参数减去第0个

我知道如果没有睡眠,
PriceUpdateForm.main
将退出,但我不明白为什么它会将窗口随之关闭。这是在GUI线程上创建的。它没有超出范围,或者至少,无论如何调用
main
:直接调用还是通过反射调用,它的范围都应该相同


有人能解释这种行为上的差异吗?我想我可以睡上一年的
,但这看起来很难看。

很难相信这种反射调用会影响行为,因为它与标准Java启动器调用主方法的方式没有什么不同(当然,它使用
getMethod
而不是
getDeclaredMethod
,但仅此而已)。也许,反射调用的周围代码很重要。顺便说一句,您可以简单地使用
String[].class
@Holger,而不是
newArgs.getClass()
,我将除了数组副本之外的所有内容注释到新参数中。相同的行为。如果在没有反射的情况下调用该方法会发生什么,即
PriceUpdateForm.main(Arrays.copyOfRange(args,1,args.length)),没有任何周围的代码?发布完整的代码(即使您“注释掉了所有内容”,仍然必须有一个周围的类和方法声明)怎么样?这取决于是什么触发了JVM关闭(以及该问题的另一个答案)。谢谢。我想我在蹦床课上发现了问题。非常有用的注释。很难相信这种反射调用会影响行为,因为它与标准Java启动器调用主方法的方式没有什么不同(当然,它使用
getMethod
而不是
getDeclaredMethod
,仅此而已)。也许,反射调用的周围代码很重要。顺便说一句,您可以简单地使用
String[].class
@Holger,而不是
newArgs.getClass()
,我将除了数组副本之外的所有内容注释到新参数中。相同的行为。如果在没有反射的情况下调用该方法会发生什么,即
PriceUpdateForm.main(Arrays.copyOfRange(args,1,args.length)),没有任何周围的代码?发布完整的代码(即使您“注释掉了所有内容”,仍然必须有一个周围的类和方法声明)怎么样?这取决于是什么触发了JVM关闭(以及该问题的另一个答案)。谢谢。我想我在蹦床课上发现了问题。非常有用的评论。
            final Class<?> mainClass = Class.forName(args[0]);
            final Method mainMethod = mainClass.getDeclaredMethod("main", newArgs.getClass());
            mainMethod.invoke(null, new Object[]{newArgs});