用于单元测试目的和模板方法模式, 我需要动态调用一些方法,如下所示:
//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()没有解决问题并提供类似的输出。
答案 0 :(得分:3)
根据javadoc,Method#invoke()
会抛出InvocationTargetException
如果基础方法抛出异常。
因此,只需捕获InvocationTargetException
并获取导致它的目标异常。
类似的东西:
try {
m.invoke();
catch (InvocationTargetException e) {
Throwable originalException = e.getTargetException();
for (StackTraceElement element : originalException.getStackTrace()) {
System.out.println(el);
}
}