Java 当反射调用main时,JVM退出,窗口可见
MacOSXCatalina JDK OpenJDK 14.0.2(同一版本14.0.1) 当这个类的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秒钟后退出,直到那时窗口才清晰可见 摘自蹦床的主要方法
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});