java - 从堆栈跟踪元素获取实际类

标签 java debugging reflection stack-trace

使用 Eclipse 我可以设置断点并在调试 View 中查看当前堆栈跟踪:

enter image description here

但是当我使用 Thread.currentThread().getStackTrace() 检查堆栈跟踪时,我得到的信息并不完全相同。例如,选定的元素是 JUnitTestClassReference 并且堆栈跟踪中的相关元素(破折号内)是 JUnit4TestReference(它的父类(super class),可能是因为 run 方法是不被子类覆盖)。

org.springframework.test.context.junit4.SpringJUnit4ClassRunner
org.springframework.test.context.junit4.SpringJUnit4ClassRunner
org.junit.runners.ParentRunner$3
org.junit.runners.ParentRunner$1
org.junit.runners.ParentRunner
org.junit.runners.ParentRunner
org.junit.runners.ParentRunner$2
org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks
org.junit.runners.ParentRunner
org.springframework.test.context.junit4.SpringJUnit4ClassRunner
---- org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference ----
org.eclipse.jdt.internal.junit.runner.TestExecution
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
  • 有什么方法可以得到子类名吗?
  • 如果没有,Eclipse 如何获取它(可能使用 JPDA )?

最佳答案

堆栈记录哪些代码正在等待调用返回,而不是哪些对象。如果该方法在父类(super class)中并且子类没有覆盖它,堆栈将记录父类(super class)方法,因为那是控制最终必须返回的地方

获取所涉及对象的运行时类的唯一方法是检查激活帧中的 this 引用的值,以进行特定的方法调用。调试器可以向您展示这一点,但并没有真正简单的方法从 Java 本身获取它,您必须使用 JDI 等调试接口(interface)。

请注意还有另一个挑战:StackTraceElement报告类名称,而不是类对象。并且由于 ClassLoader 的工作方式,同一 VM 中可能有两个具有相同名称的类,并且 StackTraceElement 没有提供足够的信息来区分他们。 (这就是像 Tomcat 这样的容器可以为同一 VM 中的两个不同应用程序加载同一库的两个不同版本的方式。)

关于java - 从堆栈跟踪元素获取实际类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30716709/

相关文章:

java - 使用 Maven 存储库的 Gradle 离线构建

java - SWT 复合变换

c++ - 如果是一个类的私有(private)数据成员并且我们创建该类的两个对象,那么指向 int 数据类型的指针是什么?

reflection - 在 Dart 中动态获取对象的字段

java - Apache 兴趣点。计算生成的(通过模板)DOCX文档页面的高度

debugging - Sudoku Project在运行时崩溃

c# - 为什么不能在 Visual Studio 2013 的条件断点中使用 lambda?

c# - 如何通过泛型获取接口(interface)的具体实现?

c# - 使用反射查找具有自定义属性的方法

java - 使用 selenium 删除/更改特定元素类属性值