如何防止调用System.exit()终止JVM?

我几乎可以肯定这是不可能的,但值得一试。

我正在为某个工具编写命令行界面。 我在谈论调用另一个Java应用程序的Java应用程序。 该工具在执行后调用System.exit ,从而终止我自己的执行环境。 我不希望这样。

有没有办法忽略System.exit调用?

是的,这可以使用SecurityManager。 请尝试以下方法

 class MySecurityManager extends SecurityManager { @Override public void checkExit(int status) { throw new SecurityException(); } @Override public void checkPermission(Permission perm) { // Allow other activities by default } } 

在您的课程中使用以下调用:

 myMethod() { //Before running the external Command MySecurityManager secManager = new MySecurityManager(); System.setSecurityManager(secManager); try { invokeExternal(); } catch (SecurityException e) { //Do something if the external code used System.exit() } } 

将SecurityManager设置为忽略System.exit(),除非它来自您的代码。

您可以将您的应用程序分为两部分。 第一个由工具启动。 然后,您将应用程序的第二部分作为新进程启动。 然后主机应用程序杀死你的第一部分,但第二部分仍在运行。

这样,您的应用程序的第一部分就是第二部分的启动,而第二部分又是您的真实应用程序。

关于这个(@Vonc答案)你应该使用安全管理器:

尝试修改TestCase以使用安全管理器运行,该管理器阻止调用System.exit,然后捕获SecurityException。