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

Tia*_*oso 28 java

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

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

有没有办法忽略System.exit电话?

the*_*ega 20

是的,这可以使用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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议还要覆盖SecurityManager的`checkPermission`方法,以避免与其他特权操作相关的安全异常. (3认同)

Fr *_*ieg 6

Java 17 更新:

这个问题的许多早期答案都提到了自定义的使用SecurityManager。这在当时是正确的。但从 Java 17 开始,System.setSecurityManager()已弃用并删除,因此这种方法将来不再适用。

  • 是的,故事在这里:https://openjdk.java.net/jeps/411 这个jeps中相关的新API,用于解决System::exit尚未定义的问题... https://bugs.openjdk.java。 net/browse/JDK-8199704 也许在其他地方。 (4认同)