从JVM上的堆栈帧获取局部变量

时间:2009-08-31 19:35:55

标签: java jvm clojure snapshot locals

有没有办法在不使用调试器的情况下在JVM上获取当前作用域中的局部变量的映射或其他数据结构?也就是说,获取当前堆栈帧的本地?

我知道有堆栈跟踪对象,但StackTraceElement无法访问任何状态。它只是告诉你在哪里调用了哪种方法,而不是它里面的内容。

2 个答案:

答案 0 :(得分:4)

变量名可以包含在类文件中以帮助调试器,但javac默认情况下不会这样做。它需要-g:vars选项。

如果存在,程序可以使用像ASM这样的字节码工程库来访问本地变量名称和范围。

虽然this question措辞不当,但我认为它是重复的,其答案可能与您的问题有关。我想补充一点,如果你不关心名字,局部变量类型和范围总是包含在每个方法的属性表中。

答案 1 :(得分:1)

我认为没有办法做到这一点。编译器总是可以自由地优化局部变量,并且提供这样的方法会阻止编译器利用这种类型的优化。在编译方法时,编译器无法判断您是否在程序中的其他位置调用了假设的getLocalVariables(),因此必须始终将所有声明的局部变量放在这样的映射中。