在我无法访问的代码中阻止系统/退出

Joh*_*den 7 clojure

通过在repl中检查它,我正在玩别人的代码.

它一直调用System/exit,这会导致我的repl.这令人气愤.

在我可以访问的所有代码中,我嘲笑了这些调用.

但它也调用了一些我没有源代码的库代码,包括java和clojure,这偶尔会导致退出.

有没有办法全局捕获这些调用,所以尝试调用它们不会杀死repl线程?理想情况下,它只会抛出异常.

我想在java中我可以安装一个新的SecurityManager来获得这个效果,但我从来没有这样做过

这里似乎有一些东西:http: //jroller.com/ethdsy/entry/disabling_system_exit

所以我想的是:

(System/setSecurityManager (SecurityManager.))
Run Code Online (Sandbox Code Playgroud)

只有我需要附加

  public void checkPermission( Permission permission ) {
    if( "exitVM".equals( permission.getName() ) ) {
      throw new ExitTrappedException() ;
    }
  }
Run Code Online (Sandbox Code Playgroud)

我到目前为止最好的射门是:

(System/setSecurityManager
 (proxy [SecurityManager] []
   (checkPermission [p]
                    (when (= "exitVM" (.getName p))
                      (throw (Exception. "exit"))))))
Run Code Online (Sandbox Code Playgroud)

或者可能

(System/setSecurityManager 
  (proxy [SecurityManager] [] 
    (checkExit [n] false)))
Run Code Online (Sandbox Code Playgroud)

但他们都只是破坏了这个代表

或者有更好的方法吗?

Dan*_*iel 2

使用 AspectJ 并以 no 操作拦截所有对 System.exit() 的调用。

但你是对的,只配置安全管理器会更明智。