如何列出 Java 方法/函数中的所有局部变量?
Posted
技术标签:
【中文标题】如何列出 Java 方法/函数中的所有局部变量?【英文标题】:How do I list all local variables within a Java method / function? 【发布时间】:2012-09-30 06:12:19 【问题描述】:我的主要问题:我知道您通常可以使用反射输出类字段,即使您不知道变量名称、类型,甚至不知道有多少。但是,假设我不知道变量名称是什么,有没有办法列出当前函数或当前范围内的所有变量?
换句话说:
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 有与 Python 的 eval()
或 php 的 get_defined_vars()
相当的功能,那就太棒了。
如果有什么不同,我使用的是 Java 6,但 Java 5、6 或 7 的任何东西都应该是好的。
谢谢!
【问题讨论】:
也许这个问题是相关的(***.com/questions/2946279/…) 【参考方案1】:据我所知,你不能。至少,不是普通的 Java 代码。如果您能够在运行之前通过某种后处理器运行字节码,并假设您仍在使用包含的调试符号进行构建,那么您可以自动生成代码来执行此操作 - 但我不相信有通过反射访问当前堆栈帧中的局部变量的任何方式。
【讨论】:
有趣。 eclipse 调试器之类的东西如何检查堆栈?它需要通过本地网络管道连接到 JVM,还是位于可以访问程序内存的线程中? @Arcymag - 我认为调试器不需要检查堆栈;它依赖于编译时创建的符号文件(或类似的东西)。【参考方案2】:如果您不想将其用作程序正常执行路径的一部分而只是用于调试,请使用Java platform debugger architecture (JPDA)。本质上,您将编写自己的调试器、设置断点并使用JDI API 来查询程序的状态。局部变量可以用StackFrame#visibleVariables()列出。
如果以上都不是一个选项,那将很难实现。要获取变量名称,您可以解析类文件并读取方法的局部变量表属性。但是,获取局部变量值的唯一方法是通过 aload/iload/etc。字节码指令。这些必须存在于您要分析的方法中,因此您不能将此功能放入不同的辅助方法中。
【讨论】:
你能告诉我在哪里可以找到 JPDA 的示例和 JPDA 的活跃在线社区吗?以上是关于如何列出 Java 方法/函数中的所有局部变量?的主要内容,如果未能解决你的问题,请参考以下文章