java - 调用类,等待它退出,再次调用

标签 java securitymanager systemexit

我正在开发一个程序,我想循环遍历多个配置文件,并对于每个文件,使用该文件名作为参数调用一个类并等待它完成。目前我正在做:

    for (int i = 1; i <= 3; i++){
        String[] a = new String[1];
        a[0] = "data/config" + i + ".xml";
        edu.cwru.sepia.Main2.class.getMethod("main", String[].class).invoke(null, (Object)a);
    }

但是,发生的情况是该类仅被调用一次,然后整个程序就会停止。我认为类中有一个退出行,但由于它是一个 JAR 文件,我无法确定,也无法编辑它。

假设情况确实如此;我该如何解决这个问题来做我想做的事?即,在调用以退出结束后,我的外循环方法将继续,并使用下一个参数再次调用该类。

最佳答案

如果问题确实是第三方类中的 System.exit() 调用,您应该能够按照 this answer 中的建议来解决该问题。 ,它提供了以下代码:

  private static class ExitTrappedException extends SecurityException { }

  private static void forbidSystemExitCall() {
    final SecurityManager securityManager = new SecurityManager() {
      public void checkPermission( Permission permission ) {
        if( "exitVM".equals( permission.getName() ) ) {
          throw new ExitTrappedException() ;
        }
      }
    } ;
    System.setSecurityManager( securityManager ) ;
  }

  private static void enableSystemExitCall() {
    System.setSecurityManager( null ) ;
  }

但是,出于您的目的,简单地 spawn a separate Java process 可能是更好的方法。对于第三方应用程序并等待其终止。这样您就不必担心第三方代码会在 JVM 实例中造成副作用,也不必担心尝试猜测如何消除副作用。

关于java - 调用类,等待它退出,再次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27339684/

相关文章:

java - 如何在 sitebricks 中测试 Reply<?>

java - eclipse oxygen版本在java 9中选择JRE运行环境

java - 除了给出 transient 关键字之外,我们可以拒绝 java 对象的序列化吗

java - 在 SecurityManager 下创建对象时出现 NoClassDefFoundError

java - HashMap Java 8 实现

java.net.SocketPermission : "connect.resolve"

Python 异常 - 捕获除预期之外的所有异常

java - 完成或从辅助 Activity 中退出应用程序?

java - 在 java 中调用 System.exit() 的确切目的是什么

java - JFrame 中的沙盒 JPanel