Java:如何在使用反射调用方法时获得完整的失败跟踪?

时间:2015-04-03 12:46:07

标签: java exception reflection junit

用于单元测试目的和模板方法模式, 我需要动态调用一些方法,如下所示:

//Unit test method call to wrap into a global test logic
Method m = myobject.getClass().getMethod("run");
m.invoke(...);

它可以正常工作,但是当方法失败(断言失败或运行时异常)时,我无法获得完整的失败跟踪。例如,如果您有一个序列调用:method1() - > method2() - >方法3() 并且method3失败,您有以下故障跟踪:

java.lang.<SomeError>:
at myexample.MyClass1.method3()
at myexample.MyClass1.method2()
at myexample.MyClass1.method1()
at myexample.Entrypoint.someEntrypoint()

调用&#34; method1()&#34;正常显示明确地在你的代码中。 但是如果你这样做:myobject.getClass()。getMethod(&#34; method1&#34;)。invoke()。 如果method3失败,则会出现以下故障跟踪:

java.lang.<SomeError>:
at myexample.Entrypoint.someEntrypoint() // calling m.invoke()

因此,当使用反射(m.invoke())调用method1时,失败跟踪在invoke()而不是invoke() - &gt;处停止。 method2() - &gt;方法3()。有一种方法可以获得完整的跟踪?谢谢。

注意:Thread.currentThread()。getStackTrace()没有解决问题并提供类似的输出。

1 个答案:

答案 0 :(得分:3)

根据javadocMethod#invoke()会抛出InvocationTargetException

  

如果基础方法抛出异常。

因此,只需捕获InvocationTargetException并获取导致它的目标异常。

类似的东西:

try {
   m.invoke();
catch (InvocationTargetException e) {
   Throwable originalException = e.getTargetException();
   for (StackTraceElement element : originalException.getStackTrace()) {
       System.out.println(el);
   }
}