Java 我可以使用main()重新启动应用程序吗?

Java 我可以使用main()重新启动应用程序吗?,java,application-restart,Java,Application Restart,我正在研究通过单击GUI上的按钮来重新启动java应用程序的方法。我在网上搜索,发现了main(新字符串[0])。我需要了解这是否是重新启动应用程序的有效方法。有人能告诉我吗?谢谢 private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) { main( new String[0]); } 这会更好吗 private void bnNewsaleActionPerformed(java.awt.

我正在研究通过单击GUI上的按钮来重新启动java应用程序的方法。我在网上搜索,发现了main(新字符串[0])。我需要了解这是否是重新启动应用程序的有效方法。有人能告诉我吗?谢谢

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {

    main( new String[0]);
    }
这会更好吗

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {
    classname.this.dispose();
    main( new String[0]);
    }
main()
是您在该类中定义的函数。
它只接受一个
string[]
类型的参数

此行调用该函数,就像调用任何其他函数一样。
它传递一个空字符串数组(
新字符串[0]

由于
main()
函数开始应用程序,因此将“重新启动”应用程序


但是,它不会重置任何静态。

它使用空字符串数组调用static
main
方法。看看这是否能让事情变得更清楚:

String[] args = new String[0]; // Or String[] args = {};
main(args);
诚然,从非main方法调用
main
方法是不常见的。。。这不会真正“重启”应用程序。它将从您现有的处理程序中调用它,这很可能会产生恶劣的后果。我不推荐


如果您能够找到一种方法来启动一个完全干净的流程,那么这将是一种更加可靠的“重新启动”。

这不是一种重新启动应用程序的好方法,因为应用程序的初始调用仍然在运行。如果你像那样“重启”你的应用程序足够多次,你会得到一个堆栈溢出


如果必须在不退出应用程序的情况下重新启动应用程序(这是不寻常的),则可以在
main
中设置
try
/
catch
块,在其周围放置循环,并在出现异常时继续循环。不可否认,这是一种解决方法,因为它使用异常来控制“正常”程序流。

如果不退出JVM,您将无法重新启动应用程序-JVM将分配对象、线程等。如果没有大量的内务管理,您将不会轻易将其丢弃

我认为更简单的方法是将应用程序包装在脚本中,如果应用程序退出时带有特定的退出代码,则让脚本重新启动应用程序。这样,您就可以通过
System.exit()
调用完全丢弃JVM,如果脚本只在看到特定退出代码时重新启动应用程序,您可以选择退出,或者退出并重新启动

e、 g.查看下表。这提供了使用特定配置/参数启动Java应用程序以及控制行为的能力。请注意,它从应用程序中提供了一个链接。

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {

    main( new String[0]);
    }
它所做的是在
bNewsaleActionPerformed
上,用一个空的新字符串调用main()。
这不会重新启动应用程序

要重新启动,请停止并重新启动

而使用您的代码,它将在ypur当前应用程序中再次启动您的应用程序。

有点像嵌套它,它会产生恶劣的影响,例如:不重置任何静态分配

下面是@Brian Agnew已经在上面提出的一个具体例子

在Java代码中,退出时使用一个特定的退出,以防重新启动

if(restart){

System.exit(5);

}else{
 System.exit(0);
}
现在创建一个实际用于启动应用程序的脚本。我在这里给出了windows批处理脚本的示例,但您可以为其他操作系统使用类似的脚本

批处理文件:

@echo off

:start

java Test %1
set exitcode=%ERRORLEVEL%

if %exitcode% == "5" (goto :start)

当您以状态代码5(可以是任何整数)退出时,批处理将重新启动程序(
Test
是具有main方法的示例类)

java中的main方法没有什么特殊之处,因此调用main与调用任何其他方法没有区别。jvm初始化的每一位都发生在java运行时搜索名为“main”的方法之前

如果您想在不退出jvm的情况下重新启动应用程序,您必须避免或清除每一点静态。对于简单的情况,您可以编写一个类来管理应用程序的生命周期,并创建一个新的实例来重新启动

class MyApplication{
    public void start(){}//setup all application state and run it
    public void shutdown(){}//close all Windows/Connections and Threads
}

对于非平凡的示例,这可能会导致错误,必须注意标记为“退出时删除”的局部变量/静态变量/文件。此外,应用程序类的更新只能通过一些类加载器技巧才能看到。

请不要像这样重新启动应用程序。重新启动应用程序的正确方法是使用程序必需的类路径/选项执行一个新的Java命令。这是一种丑陋的重新启动方法。@Vulcan不可否认,这是一种接近黑客攻击的最后解决方案。我编辑了我的答案以澄清问题。如果你的应用程序的GUI仍处于运行状态,则该应用程序已在运行