我几乎可以确定这是不可能的,但值得一试。
我正在为某个工具编写命令行界面。我在谈论一个调用另一个Java应用程序的Java应用程序。该工具在执行后调用System.exit
,从而终止了我的执行环境。我不希望出现这种情况。
有没有办法忽略System.exit
调用?
我几乎可以确定这是不可能的,但值得一试。
我正在为某个工具编写命令行界面。我在谈论一个调用另一个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()
}
}
Java 17更新:
之前回答这个问题的很多人都提到了使用自定义的SecurityManager
。在当时这是正确的做法。但是从Java 17开始,System.setSecurityManager()
已被弃用并将来会被移除,所以这种方法在未来将无法使用。
关于这个(@Vonc的答案),你应该使用安全管理器:
尝试修改TestCase以运行具有防止调用System.exit的安全管理器,然后捕获SecurityException。