2014-04-04 2 views
1

각 20 개의 Java 프로그램에 각각 main() 함수가 있습니다. 나는 그들 모두를 호출하고 예외를 확인하고 싶다.다른 Java 프로그램을 호출하여 예외 잡기

다른 Java 프로그램에서 Java 프로그램을 호출하는 방법이 있습니까? 또한 예외가 리턴됩니까?

+2

아마도 뭔가 ClassLoader를 사용하여 해킹. 내가 생각할 수있는 유일한 대안은'Runtime.getRuntime(). exec (...)'이지만 출력 파싱 이외의 예외를 잡을 수는 없다. – Rogue

+6

다른 클래스에서'main'을 호출 할 수 있습니다. 그것은 단지 방법 일뿐입니다. 'java MyDriverClass'를 수행하고 MyDriverClass가 다른 클래스의'main' 메소드를 호출하도록합니다 (그리고 원하는대로 예외를 잡습니다). –

+0

좋아, 해보겠습니다. – Ajax

답변

0
public class Main{ 
    public static void main(String args[]){ 
    try{ 
     AnotherClass.main(null); // null inserted for string[] args in the AnotherClass.main 
    catch(Exception ex){ 
     //do whatever you want 
    } 
    } 
} 

전화

java Main 

와 메인 클래스는 메인 AnotherClass를 실행하면 예외를 잡을 수 있습니다.

+0

클래스 목록을 반복하지 않고 내 클래스가 com.xyz.AnotherClass1, com.xyx.anotherxlass2 등의 경우 드라이버 파일에 수동으로 추가 하시겠습니까? – Ajax

+0

http://stackoverflow.com/questions/5926144/loading-a-class-from-out-of-classpath-by-using-java-reflection 은 좋은 시작입니다. 클래스 로더를 사용하여 클래스를로드합니다. 그러면 리플렉션을 사용하여 기본 메소드를 호출 할 수 있습니다. 각 반마다 – Chamil

+0

이것은 20 개의 다른 클래스에 대해서는 응답하지 않습니다. 사용자는 모든 클래스 main 메소드 –

0

리플렉션을 사용할 수 있습니다. 그냥 파일이나 데이터베이스에있는 모든 클래스 이름을 가지고 있고 당신은 확실히 (교체 아웃 반사 또는과) 부모 클래스의 모든 정적 main의를 호출 할 수 있지만 다음 단계

List<String> listOfJavaFiles = new ArrayList<String>(); 
    // 
    listofJavaFiles.add("package.className"); 
    --- 
    // 
    for(String fileName = listOfJavaFiles){ 
    Class<?> cl = Class.forName(fileName); 

Method mh = null; 
     try { 
      mh = cl.getMethod("main",String[].class); 
     } catch (NoSuchMethodException nsme) { 


     } catch (SecurityException se) { 

     } 
     if(mh!=null){ 


      try { 
       mh.invoke(null,(Object)new String[0]); 
      } catch (IllegalAccessException e) { 


      } catch (IllegalArgumentException e) { 


      } catch (InvocationTargetException e) { 


      }catch(Exception e){ 
      //your logic should go here 
        ////The exception will get thrown here for your main program  provided your main program does not throw IllegalAccessException ,IllegalArgumentException and InvocationTargetException 
      } 

     } 

} 
+0

@AdamGent True를 명시 적으로 호출해야하지만 20 개의 클래스에 대해 20 개의 metthod 호출을 작성해야합니다. 하나의 메소드로 반복 및 호출 할 수 있습니다 이 모든 수업의 주된 방법은 –

+0

입니다. OP가 무엇을 요구했는지 또는 그의 의도가 무엇인지 나는 완전히 확신하지 못했습니다. 그래서 당신은 나의 이전 코멘트를 무시할 수 있습니다. –

0

을 사용하여 내가보기 엔 당신을 추천합니다 코드를 리팩터링하고 모든 클래스가 인터페이스를 구현하도록하십시오.

public interface CustomMain { 
    public void doMain(String args[]); 
} 

public class OneOfTheMainClasses implements CustomMain { 
    public static void main(String args[]) { 
    new OneOfTheMainClasses().doMain(args); // for backward compat. 
    } 
    public void doMain(String args[]) { //work here } 
} 

그런 다음 코드에서 당신은 main을 가지고 있으며, CustomMain를 구현하는 각 클래스를 만들 것하고는 List<CustomMain>에 넣어. 당신이 리팩토링해야하는 이유

List<CustomMain> mains = ...; //(Either use reflection or manually add the instances) 
for (CustomMain m : mains) { 
    try { 
    m.doMain(args); 
    } catch (Exception e) { 
    // do what you want here. 
    } 
} 

하나의 큰 이유는합니다 ... static main는 점에서 암시 적 계약이 진입 점과 종료 시점입니다 있습니다. 그것은 static main입니다 System.exit(0) 또는 다양한 다른 종료 절차를 호출 할 수 있습니다

+0

프로그램 어디서나 System.exit (0)을 호출할까요? –