web-dev-qa-db-ja.com

Java Reflectionを使用して例外をスローするメソッドを呼び出す方法は?

Java Reflectionを使用してメソッドを呼び出したいと思います。

問題は、このメソッド(私が書いた)が例外をスローすることです(私はmyCustomExceptionを作成しました)。 try/catch句を追加すると、Eclipseが「catch句に到達できません」と表示するため、プロジェクトを実行できません。

これが私がクラスでmyMethodを呼び出そうとしたときですMyClass

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

myMethodMyCustomExceptionをスローしない場合、すべてが正常です。しかし、MyCustomExceptionをスローすると、次のエラーメッセージが表示されます。

クラスにあるfooMethod()を呼び出そうとしたとしましょうBarClass()、そして:

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

それも可能ですか?とにかく助けてくれてありがとう。

17
cleroo

元の例外となる原因を突き止めることができます。

InvocationTargetException.getCause();

ドキュメントから:

InvocationTargetExceptionは、呼び出されたメソッドまたはコンストラクターによってスローされた例外をラップするチェック済みの例外です。

http://docs.Oracle.com/javase/6/docs/api/Java/lang/reflect/InvocationTargetException.html

Catchブロックで、例外が予期したタイプのものであるかどうかを確認し、それを処理できます。

簡単なアプローチの1つは次のとおりです。

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

それを行う1つの方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}
9
Marko Topolnik

myMethod.invoke(null, myParam)を実行するメソッドにcatch句を追加しようとしている場合、それは明らかに正しい方法ではありません。この場合、リフレクションを介してメソッドを呼び出していますが、invokeメソッドが他の例外をスローするため、これは例外をキャッチする場所ではありません。例外をスローするメソッドを呼び出すと、例外がある場合、正しく思い出せば、例外がスローされ、InvocationTargetExceptionにラップされます。

InvocationTargetExceptionに関する この説明 の最後の部分を確認してください。

1
carlspring