2009-08-31 50 views
8

有沒有任何方法可以在不使用調試器的情況下在JVM上的當前範圍內獲取本地變量的映射或其他數據結構?也就是說,要獲得當前的堆棧框架的當地人?從JVM上的堆棧幀獲取本地變量

我知道有堆棧跟蹤對象,但StackTraceElement有沒有辦法可以訪問任何狀態。它只是告訴你什麼方法被稱爲哪裏,而不是什麼方法。

回答

4

變量名稱可以包含在類文件中以幫助調試器,但javac默認情況下不會這樣做。它需要-g:vars選項。

如果是現在,一個程序可以使用一個字節碼工程庫像ASM訪問本地變量名和範圍。

雖然this question是措辭不當,我認爲這是一個重複的,其答案可能與你的問題。我會補充一點,如果你不關心名稱,局部變量類型和範圍總是包含在每個方法的屬性表中。

1

我不認爲有辦法做到這一點。編譯器總是可以自由地優化掉本地變量,並且提供這樣的方法會阻止編譯器利用這種優化。編譯方法時,編譯器將無法分辨是否在程序中的其他位置調用了假想的getLocalVariables(),因此它必須始終將所有聲明的局部變量放在這樣的映射中。

+0

本地變量在StackFrame中的地圖中可用。你可以在這裏看看https://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/com/sun/jdi/StackFrame.html – 2014-12-11 19:48:14