如何列出Java方法/函数中的所有局部变量?
我的主要问题是:我知道您可以使用反射一般地输出类字段,即使您不知道变量名、类型,甚至不知道有多少。但是,假设我不知道变量名是什么,有没有办法列出当前函数或当前范围内的所有变量 换言之:如何列出Java方法/函数中的所有局部变量?,java,reflection,compiler-construction,profiling,antlr,Java,Reflection,Compiler Construction,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". 我也很乐意回答这个问题: 假设我可以存储所有变量的名称,这有帮助吗?e、 g: Set&
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".
我也很乐意回答这个问题:
假设我可以存储所有变量的名称,这有帮助吗?e、 g:
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"?
Set varNames=new HashSet();
int x=5;
添加(“x”);
int y=42;
添加(“y”);
//还有代码吗
//现在使用varNames,我可以不使用“x”或“y”输出x和y吗?
我为什么要问这个?我正在使用ANTLR将XYZ语言翻译成java,我想提供一个简单的方法,在任何时间点输出程序的整个状态
第三种可能的解决方案是:如果这在Java中是不可能的,有没有办法为访问调用函数并检查堆栈的函数编写字节码?这也可以解决问题
令人惊奇的是,如果Java有Python的eval()
或php的get\u defined\u vars()
的等价物
如果有区别的话,我使用的是Java6,但是Java5、6或7的任何东西都应该是好的
谢谢 据我所知,你不能。至少,不是用普通的Java代码。如果您能够在运行字节码之前通过某种后处理器运行字节码,并且假设您仍在使用包含的调试符号进行构建,然后,您可以自动生成代码来执行此操作—但我认为没有任何方法可以通过反射访问当前堆栈帧中的局部变量。如果您不想将此作为程序正常执行路径的一部分,而只是为了调试,请使用。基本上,您将编写自己的调试器,设置断点并使用查询程序状态。局部变量可以与一起列出
如果上述方案不可行,则很难实现。要获取变量名,可以解析类文件并读取方法的局部变量表属性。但是,获取局部变量值的唯一方法是通过aload/iload/etc.字节码指令。这些必须存在于要分析的方法中,因此不能将此功能放入其他帮助器方法中 有趣。eclipse调试器之类的东西是如何检查堆栈的?它是否需要通过本地网络管道连接到JVM,或者它位于可以访问程序内存的线程中?@Arcymag-我认为调试器不需要检查堆栈;它依赖于编译时创建的符号文件(或类似的东西)。也许这个问题是相关的()你能告诉我在哪里可以找到JPDA的示例和JPDA的活动在线社区吗?