6

我正在研究一种通过单击 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]);
    }
4

7 回答 7

13

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

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

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

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

于 2012-10-31T23:40:56.020 回答
7

您将无法在不退出 JVM 的情况下重新启动您的应用程序 - JVM 将分配对象、线程等,并且如果没有大量的内务处理,您将不会轻易地破坏它。

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

例如检查JavaServiceWrapper。这提供了使用特定配置/参数启动 Java 应用程序并控制重新启动行为的能力。请注意,它提供了一个特定的 API 调用来从您的应用程序中调用重新启动。

于 2012-10-31T23:45:30.173 回答
3

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

如果您必须重新启动您的应用程序而不退出它(这是不寻常的),您可以在您的 中设置一个try/catchmain,围绕它放置一个循环,并在遇到异常时继续循环。诚然,这更像是一种解决方法,因为它使用异常来控制“正常”程序流。

于 2012-10-31T23:41:21.983 回答
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是具有 main 方法的示例类

于 2012-11-01T07:34:06.547 回答
1

当你读到那个。

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

    main( new String[0]);
    }

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

重新开始意味着,停止并重新开始。

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

于 2012-10-31T23:49:32.047 回答
0

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

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

由于您的main()函数开始您的应用程序,这将“重新启动”它。

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

于 2012-10-31T23:40:43.790 回答
0

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
}

对于非平凡的示例,这可能会导致丑陋的 ThreadLocals/静态变量/在退出时标记为删除的文件必须小心处理。此外,应用程序类的更新只能通过一些类加载器技巧可见。

于 2012-11-01T12:31:07.270 回答