Java 我可以使用main()重新启动应用程序吗?
我正在研究通过单击GUI上的按钮来重新启动java应用程序的方法。我在网上搜索,发现了main(新字符串[0])。我需要了解这是否是重新启动应用程序的有效方法。有人能告诉我吗?谢谢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.
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仍处于运行状态,则该应用程序已在运行