当前位置: 首页 > 知识库问答 >
问题:

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

齐成双
2023-03-14

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

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

这是可行的,但当方法失败(断言失败或运行时异常)时,我无法获得完整的失败跟踪。例如,如果您有一个序列调用:method1()-

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

这是在代码中显式调用“方法1()”时的正常显示。但是如果这样做了:myobject.get类()。get方法(“方法1”)。调用()。如果方法3失败,您会有以下失败跟踪:

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

因此,当使用反射(m.invoke())调用method1时,故障跟踪会在invoke()而不是invoke()处停止-

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

共有1个答案

杜高谊
2023-03-14

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

如果基础方法引发异常。

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

类似的东西:

try {
   m.invoke();
catch (InvocationTargetException e) {
   Throwable originalException = e.getTargetException();
   for (StackTraceElement element : originalException.getStackTrace()) {
       System.out.println(el);
   }
}
 类似资料:
  • 问题内容: 如何使用反射调用带有参数的方法? 我想指定这些参数的值。 问题答案: 这是一个使用涉及原语的反射调用方法的简单示例。 要健壮,应该捕获和处理所有检查反射有关的异常,,。

  • 问题内容: 我有两节课: 我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。 但是上述代码仍会调用。 问题答案: 如果使用的是JDK7,则可以使用MethodHandle实现此目的:

  • 问题内容: 当使用反射从另一个主要方法调用Java类的主要方法时, 我应该创建newInstance()还是直接调用main(),因为它是静态的。 问题答案: 对于您陈述的要求(动态地调用随机类的main方法,通过反射,您有很多不必要的代码。 您不需要为该类调用构造函数 您不需要内省类字段 由于您正在调用静态方法,因此甚至不需要真正的对象来调用该方法。 您可以修改以下代码来满足您的需求:

  • 问题内容: 我需要使用反射调用类的setter方法,并且代码如下: 的是一个以及设置器方法如下: 运行此代码时,将引发A ,但是将setter方法参数类型更改为from时,将执行正常。有没有一种方法可以将setter方法的参数保持为超级类型,并且在从类中获取方法时仍无需手动指定参数的类型即可使用反射? 问题答案: 与其他答案相反,有一个非常简单的解决方案。请参阅。它为您提供了一种执行任意反射代码的

  • 问题内容: 我需要使用反射从另一个主要方法调用Java类的主要方法。 必须使用反射,以消除被调用主类的编译时依赖性。直截了当的方法并没有产生效果,因为它只识别“公共”和“非静态”方法。有什么建议吗? 问题答案: 不应比调用任何其他函数更复杂: 但是我真的看不到有什么用途,只要您不使用特定的代码路径,就可以买到该程序,而无需链接另一个程序,这是它唯一能为您带来的好处,但是如果这是您需要的,在这里走

  • 本文向大家介绍在Java中使用反射调用对象的方法,包括了在Java中使用反射调用对象的方法的使用技巧和注意事项,需要的朋友参考一下 可以使用java.lang.Class.getDeclaredMethods()方法调用对象的方法。此方法返回一个数组,其中包含具有公共,私有,受保护和默认访问权限的所有Method对象。但是,不包括继承的方法。 另外,如果类或接口没有方法,或者在Class对象中表示