如何防止调用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。