Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JVM上的堆栈帧获取局部变量_Java_Jvm_Clojure_Snapshot_Locals - Fatal编程技术网

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

Java 从JVM上的堆栈帧获取局部变量,java,jvm,clojure,snapshot,locals,Java,Jvm,Clojure,Snapshot,Locals,有没有办法不使用调试器就在JVM上获取当前作用域中的局部变量的映射或其他数据结构?也就是说,获取当前堆栈帧的局部变量 我知道有stacktrace对象,但StackTraceeElement无法访问任何状态。它只是告诉您在哪里调用了什么方法,而不是其中的内容。我认为没有办法做到这一点。编译器总是可以自由地优化局部变量,提供这样的方法会阻止编译器利用这种类型的优化。编译方法时,编译器无法判断您是否在程序中的其他地方调用了一个假想的getLocalVariables(),因此它必须始终将所有声明的局

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


我知道有stacktrace对象,但
StackTraceeElement
无法访问任何状态。它只是告诉您在哪里调用了什么方法,而不是其中的内容。

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

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

如果存在,程序可以使用字节码工程库来访问局部变量名和作用域


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

局部变量在StackFrame的映射中可用。你可以看看这里