有沒有任何方法可以在不使用調試器的情況下在JVM上的當前範圍內獲取本地變量的映射或其他數據結構?也就是說,要獲得當前的堆棧框架的當地人?從JVM上的堆棧幀獲取本地變量
我知道有堆棧跟蹤對象,但StackTraceElement
有沒有辦法可以訪問任何狀態。它只是告訴你什麼方法被稱爲哪裏,而不是什麼方法。
有沒有任何方法可以在不使用調試器的情況下在JVM上的當前範圍內獲取本地變量的映射或其他數據結構?也就是說,要獲得當前的堆棧框架的當地人?從JVM上的堆棧幀獲取本地變量
我知道有堆棧跟蹤對象,但StackTraceElement
有沒有辦法可以訪問任何狀態。它只是告訴你什麼方法被稱爲哪裏,而不是什麼方法。
變量名稱可以包含在類文件中以幫助調試器,但javac
默認情況下不會這樣做。它需要-g:vars
選項。
如果是現在,一個程序可以使用一個字節碼工程庫像ASM訪問本地變量名和範圍。
雖然this question是措辭不當,我認爲這是一個重複的,其答案可能與你的問題。我會補充一點,如果你不關心名稱,局部變量類型和範圍總是包含在每個方法的屬性表中。
我不認爲有辦法做到這一點。編譯器總是可以自由地優化掉本地變量,並且提供這樣的方法會阻止編譯器利用這種優化。編譯方法時,編譯器將無法分辨是否在程序中的其他位置調用了假想的getLocalVariables()
,因此它必須始終將所有聲明的局部變量放在這樣的映射中。
本地變量在StackFrame中的地圖中可用。你可以在這裏看看https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html – 2014-12-11 19:48:14