2012-07-12 2 views
16

Java Reflection을 사용하여 메소드를 호출하려고합니다.Java Reflection을 사용하여 예외를 throw하는 메소드를 호출하는 방법은 무엇입니까?

문제는이 메서드 (내가 작성한)가 Exception을 던졌습니다 (myCustomException). try/catch 절을 추가 할 때 Eclipse에서 "catch 절을 도달 할 수 없다"고했기 때문에 프로젝트를 실행할 수 없습니다. MyCustomException, eveything 괜찮 throw하지 않습니다을 MyMethod라는 때

270. myMethod.invoke(null, myParam); // NB : null because myMethod is static 

: 나는 수업 시간에 MyClass에을 MyMethod라는를 호출 할 때 다음

이다.

것은이 전 클래스 BarClass()fooMethod()를 호출하려고한다고 가정 해 봅시다, 그리고 : 그것은 MyCustomException을 던져 때,이 오류 메시지가

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.tests.MyClass.test5(270) 
    at com.tests.MyClass.main(297) 
Caused by: com.tests.MyCustomException 
    at com.tests.barClass.fooMethod(BarClass.java:129) 
    ... 6 more 

심지어 가능합니까? 어쨌든 도움을 주셔서 감사합니다.

+0

것 같습니다. try-catch로 둘러 쌉니다. – Razvan

답변

23

원래 예외가되는 원인을 확인할 수 있습니다. 문서에서

InvocationTargetException.getCause(); 

:

InvocationTargetException는, 불려 간 메소드 또는 constructor에 의해 던져진 예외를 감싸는 체크가 끝난 예외입니다. 예외가 당신이 기대하고 처리 유형에있는 경우, 귀하의 catch 블록에서

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html , 당신은 확인할 수 있습니다.

한 가지 간단한 방법은 다음과 같습니다 당신이 myMethod.invoke(null, myParam)을 실행하는 방법에 catch 절을 추가하려는 경우

try { 
    ... 
} catch (InvocationTargetException ite) { 
    if (ite.getCause() instanceof SomeExceptionType) { 
     ... 
    } else { 
     ... 
    } 
} 
+0

감사! 그것은 작동합니다. 그러나 'MyCustomException (newCustomException ("the message")'처럼 MyCustomException을 생성 한 경우에도 getCause(). getMessage()와 함께 MyCustomException에서 메시지를 가져올 수 없습니다. – cleroo

+0

이것이 특정 구현으로 인해 발생할 수 있다고 생각합니다. 예외가 실제로 메시지를 보유하고 있는지 디버깅하고 확인할 수 있습니까? –

+0

나는 Marko Topolnik의 길을 이어 나갔다. 어쨌든 고맙습니다. – cleroo

1

, 그 그 일을의 올바른 방법은 분명히 아니다. 이 경우에는 리플렉션을 통해 메소드를 호출하는 것이므로 invoke 메소드가 다른 예외를 throw하므로 예외를 잡을 수있는 곳이 아닙니다. 예외를 throw하는 메서드를 호출하면 예외가 발생하면 정확하게 호출하면 throw되고 InvocationTargetException으로 래핑됩니다.

InvocationTargetException에 관한 this explanation의 마지막 부분을 확인하십시오. 그것을 할 수

9

한 가지 방법은 : 메소드 호출이 예외를 던지고있다처럼

try { myMethod.invoke(null, myParam); } 
catch (InvocationTargetException e) { 
    try { throw e.getCause(); } 
    catch (MyCustomException e) { ...} 
    catch (MyOtherException e) { ...} 
} 
+0

+1 좋은 접근;) –

+0

사실 그것은 작동하지 않았다 :/ – cleroo

+0

그것은 작동합니다. MyCustomException에서 생성자가 올바르게 설정되지 않은 것은 내 잘못입니다. 메시지를 전달하지 않았습니다! 어리석은 오류 – cleroo