2012-10-31 60 views
6

我正在研究一种通过单击GUI上的按钮重新启动我的Java应用程序的方法。我搜索了网页,并遇到主要(新的字符串[0])。我需要了解这是否是重新启动我的应用程序的有效方法。有人可以提醒,谢谢。我可以使用main()来重新启动我的应用程序吗?

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]); 
    } 
+0

如果您的应用程序的GUI仍然存在,那么应用程序已经在运行 –

回答

0

main()是你在类中定义的功能。
它需要一个类型为string[]的参数。

这行代码与其他函数一样调用该函数。
它传递一个空字符串数组(new String[0]

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

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

13

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

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

必须承认,这是不寻常的呼吁来自非主要方法main方法......这不会真正“重启”的应用程序。它将从您现有的处理程序内部调用它,这可能会带来不好的后果。我不会推荐它。

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

3

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

如果您必须重新启动不退出它(这是不寻常的),你可以设置一个try/catch块你main里面,把环周围,并不断循环的时候,你会得到一个异常应用程序。无可否认,这比其他任何方法都更具有解决方法,因为它使用异常来控制“正常”程序流。

+0

请不要重新启动应用程序。重新启动应用程序的正确方法是使用程序的必需类路径/选项执行新的Java命令。 – Vulcan

+0

这是一种难以重新启动的方式。 –

+0

@Vulcan无可否认,这是一个最后的解决方案,接近黑客。我编辑了我的答案,以表明清楚。 – dasblinkenlight

7

如果不退出JVM,您将无法重新启动应用程序 - JVM将分配对象,线程等,并且没有很多内务管理,您不会轻易地将此垃圾邮件垃圾回收。

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

例如请查看JavaServiceWrapper。这提供了使用特定配置/参数启动Java应用程序并控制restart行为的功能。请注意,它在您的应用程序中提供了一个particular API call to invoke a restart

1

正如你读到的那样。

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

    main(new String[0]); 
    } 

它是做什么的bnnewsaleActionPerformed它调用的main()与空新的字符串。
这不会重新启动您的应用程序。

重新启动意味着停止并重新开始。

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

0

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

0

java中没有什么特别的主要方法,所以调用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 /静态变量/文件标记删除退出必须得到照顾。对应用程序类的更新也只会在某些类加载器的情况下可见。

相关问题