Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
有没有办法在不使用调试器的情况下在 JVM 上获取当前范围内局部变量的映射或其他数据结构?也就是获取当前栈帧的locals?
我知道有堆栈跟踪对象,但StackTraceElement无法访问任何状态。它只是告诉您在哪里调用了哪个方法,而不是其中的内容。
StackTraceElement
变量名可以包含在类文件中以帮助调试器,但javac默认情况下不这样做。它需要-g:vars选项。
javac
-g:vars
如果存在,程序可以使用像ASM这样的字节码工程库来访问局部变量名称和范围。
虽然这个问题措辞不佳,但我认为它是重复的,它的答案可能与您的问题有关。我要补充一点,如果您不关心名称,则局部变量类型和范围始终包含在每个方法的属性表中。
我不认为有办法做到这一点。编译器总是可以自由地优化掉局部变量,并且提供这样的方法会阻止编译器利用这种类型的优化。编译方法时,编译器无法判断您是否getLocalVariables()在程序的其他地方调用了假设,因此它必须始终将所有声明的局部变量放在这样的映射中。
getLocalVariables()