7

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

换句话说:

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".

我也很乐意回答这个问题:假设我可以存储所有变量的名称,这有帮助吗?例如:

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"?

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

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

如果 Java 有 Pythoneval()或 php 的get_defined_vars().

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

谢谢!

4

2 回答 2

4

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

于 2012-09-30T06:40:36.547 回答
1

如果您不想将其用作程序正常执行路径的一部分而只是用于调试,那么请使用Java 平台调试器体系结构 (JPDA)。本质上,您将编写自己的调试器、设置断点并使用JDI API来查询程序的状态。局部变量可以用StackFrame#visibleVariables()列出。

如果上述不是一个选项,将很难实现。要获取变量名称,您可以解析类文件并读取方法的局部变量表属性。但是,获取局部变量值的唯一方法是通过 aload/iload/etc。字节码指令。这些必须存在于您要分析的方法中,因此您不能将此功能放入不同的辅助方法中。

于 2012-09-30T11:09:59.613 回答