簡體   English   中英

從堆棧跟蹤元素中獲取實際的類

[英]Get actual class from stack trace element

使用Eclipse我可以設置斷點並在調試視圖上查看當前堆棧跟蹤:

在此輸入圖像描述

但是當我使用Thread.currentThread().getStackTrace()檢查堆棧跟蹤時,我得到的信息並不完全相同。 例如,selected元素是JUnitTestClassReference ,堆棧跟蹤中的相關元素(在破折號內)是JUnit4TestReference (它的超類,可能是因為子類沒有覆蓋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 )?

堆棧記錄哪些代碼正在等待返回的調用,而不是哪些對象 如果方法在超類中並且子類不覆蓋它,則堆棧將記錄超類方法, 因為這是控制必須最終返回的位置

獲取所涉及對象的運行時類的唯一方法是檢查該方法的特定調用的激活幀中this引用的值。 調試器可以向您展示,但是沒有非常簡單的方法可以從Java本身獲得它,您必須調試JDI之類的調試接口。

請注意,還有另一個挑戰: StackTraceElement報告類 ,而不是類對象 並且由於ClassLoader的工作方式,同一個VM中可以有兩個具有相同名稱的類,而StackTraceElement不會為您提供足夠的信息來區分它們。 (這就像Tomcat這樣的容器可以為同一個VM中的兩個不同應用程序加載同一個庫的兩個不同版本。)

StackTraceElement不包含對所涉及的實際對象的引用,僅對類進行引用。 我可以想出為什么這實際上是一個好主意的一些原因,最重要的是StackTraceElement串行性。

StackTraceElement的類引用被定義為引用聲明方法的類,而不是發生異常時保存方法的當前對象的類。 這可能是因為您可以將超級實現與重寫實現區分開來。 因此,只有異常后的堆棧跟蹤既不能獲得實際的對象,也不能獲得實際的子類(更多)。

Eclipse(和其他調試器接口)向您顯示程序運行時的實時跟蹤。 您正確地注意到此實時信息是通過JPDA獲得的。

Java調試接口(JDI)可以訪問表示為StackFrame實時堆棧幀信息,其中實際對象可用:

ObjectReference thisObject()

返回當前幀的'this'值。 'this'的ObjectReference僅適用於非本機實例方法。

也許這有助於將來參考,因為我遇到了同樣的問題,並且想知道如何做到這一點

您可以使用以下方法從StackTraceElement獲取方法對象:

//replace with your StackTraceElement 
StackTraceElement method_obj = Thread.currentThread().getStackTrace()[0]

Class<?> object_context = Class.forName(method_obj.className)
Method method = object_context.getMethod(method_obj.methodName, null)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM