如何使用Java Reflection调用抛出异常的方法?

cle*_*roo 17 java reflection exception invoke

我想使用Java Reflection调用一个方法.

问题是这个方法(我写的)抛出一个Exception(我创建了一个myCustomException).当我添加一个try/catch子句时,我无法运行我的项目,因为Eclipse说"catch子句无法访问".

这是我尝试在类MyClass中调用myMethod的时候:

270.    myMethod.invoke(null, myParam); // NB : null because myMethod is static
Run Code Online (Sandbox Code Playgroud)

myMethod没有抛出MyCustomException时,eveything就可以了.但是当它抛出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
Run Code Online (Sandbox Code Playgroud)

它甚至可能吗?无论如何,谢谢你的帮助.

Fra*_*eth 27

你可以得到它的原因,这将是原始的例外.

InvocationTargetException.getCause();
Run Code Online (Sandbox Code Playgroud)

来自文档:

InvocationTargetException是一个已检查的异常,它包装被调用的方法或构造函数抛出的异常.

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

在catch块中,您可以检查异常是否来自您期望的类型并处理它.

一个简单的方法是:

try {
   ...
} catch (InvocationTargetException ite) {
   if (ite.getCause() instanceof SomeExceptionType) {
      ...
   } else {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*nik 9

一种方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}
Run Code Online (Sandbox Code Playgroud)