gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:14:32 25 4
gpt4 key购买 nike

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

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

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

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

这是在您的代码中显式调用“method1()”时的正常显示。但是如果你这样做:myobject.getClass().getMethod("method1").invoke()。如果 method3 失败,您有以下失败痕迹:

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

因此,当使用反射 (m.invoke()) 调用方法 1 时,失败跟踪停止在 invoke() 而不是 invoke() -> method2() -> method3()。有办法获得完整的踪迹吗?谢谢。

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

最佳答案

根据javadoc , Method#invoke() 将抛出 InvocationTargetException

if the underlying method throws an exception.

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

类似于:

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

关于Java:使用反射调用方法时如何获得完整的故障跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29432451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com