Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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方法/函数中的所有局部变量?_Java_Reflection_Compiler Construction_Profiling_Antlr - Fatal编程技术网

如何列出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的活动在线社区吗?