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

时间:2012-07-12 12:36:57

标签: java exception reflection invoke

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:25)

你可以得到它的原因,这是原来的例外。

InvocationTargetException.getCause();

来自文档:

  

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 {
      ...
   }
}

答案 1 :(得分:9)

一种方法:

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

答案 2 :(得分:1)

如果您尝试在执行catch的方法中添加myMethod.invoke(null, myParam)子句,那么这显然不是正确的方法。在这种情况下,您通过反射调用方法,这不是捕获异常的地方,因为invoke方法抛出其他异常。一旦你调用抛出异常的方法,如果有异常,如果我没记错的话,它会被抛出并包裹在InvocationTargetException中。

检查有关InvocationTargetException的{​​{3}}的最后部分。