我可以使用main()重启我的应用程序吗?

时间:2012-10-31 23:38:46

标签: java application-restart

我正在研究一种通过单击GUI上的按钮来重启我的java应用程序的方法。我在网上搜索并遇到了main(new String [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]);
    }

7 个答案:

答案 0 :(得分:13)

它使用空字符串数组调用静态main方法。看看这是否更清楚:

String[] args = new String[0]; // Or String[] args = {};
main(args);

不可否认,从非主方法调用main方法是不寻常的......这不会真正“重启”应用程序。它将从您现有的处理程序中将其称为,这可能会产生令人讨厌的后果。我不推荐它。

如果你能找到一种方法来开始一个完全干净的过程,那将是一个更可靠的“重启”。

答案 1 :(得分:7)

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

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

e.g。看看JavaServiceWrapper。这提供了使用特定配置/参数启动Java应用程序以及控制restart行为的功能。请注意,它会在您的应用程序中提供particular API call to invoke a restart

答案 2 :(得分:3)

这不是重新启动应用程序的好方法,因为应用程序的初始调用仍将运行。如果你"重启"你的应用程序就足够了,你会得到堆栈溢出。

如果您必须重新启动应用程序而不退出(这是不常见的),您可以在try内设置catch / main块,围绕它设置一个循环,然后当你得到一个例外时继续循环。不可否认,这更像是一种解决方法而不是其他任何方法,因为它使用异常来控制"正常"程序流程。

答案 3 :(得分:1)

正如你所读到的那样。

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

    main( new String[0]);
    }

它在bnnewsaleActionPerformed正在做的是用一个空的新字符串调用main() 这不会重新启动您的应用程序。

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

然而,对于您的代码,它将在ypur当前应用程序中再次启动您的应用程序 有点像嵌套它,它将有令人讨厌的效果,例如:不重置任何静态分配。

答案 4 :(得分:1)

这是@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是具有主方法的示例类

答案 5 :(得分:0)

main()是您在该课程中定义的函数 它需要一个string[]类型的参数。

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

由于您的main()函数启动了您的应用程序,因此将“重启”它。

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

答案 6 :(得分:0)

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

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

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

对于非平凡的例子,这可能会让丑陋的ThreadLocals /静态变量/文件在退出时标记为删除必须要处理。只有使用一些类加载器技巧才能看到对应用程序类的更新。