如何在Java方法/函数中列出所有局部变量?

Arc*_*mag 7 java compiler-construction reflection profiling antlr

我的主要问题:我知道你可以通过反射来输出类字段,即使你不知道变量名,类型,甚至有多少.但是,有没有办法列出当前函数或当前范围内的所有变量,假设我不知道变量名是什么?

换一种说法:

int x = 5;
int y = 42;
// some more code
//Now I want to println x and y, but assuming I cannot use "x" or "y".
Run Code Online (Sandbox Code Playgroud)

我也很高兴回答这个问题:假设我允许存储所有变量的名称,这有帮助吗?例如:

Set<String> varNames = new HashSet<String>();
int x = 5;
varNames.add("x");
int y = 42;
varNames.add("y");
// some more code
//Now with varNames, can I output x and y without using "x" or "y"?
Run Code Online (Sandbox Code Playgroud)

我为什么这么问?我正在使用ANTLR将XYZ语言翻译成java,我想提供一种简单的方法来在任何时间点输出程序的整个状态.

第三种可能的解决方案我很满意:如果在Java中这是不可能的,有什么方法可以为访问调用函数并检查堆栈的函数编写字节码?这也可以解决问题.

令人惊奇的是,如果Java具有相当于Python eval()或php的功能get_defined_vars().

如果它有所作为,我使用Java 6,但Java 5,6或7的任何东西都应该是好的.

谢谢!

Jon*_*eet 5

据我所知,你不能。至少对于普通的 Java 代码来说是这样。如果您能够在运行字节码之前通过某种后处理器运行字节码,并且假设您仍在使用包含的调试符号进行构建,那么您可以自动生成代码来执行此操作 - 但我不相信有通过反射访问当前堆栈帧中的局部变量的任何方式。