How do I list all local variables within a Java method / function?

antlr, compiler-construction, java, profiling, reflection

Solution

You can't, as far as I'm aware. At least, not with normal Java code. If you're able to run the bytecode through some sort of post-processor before running it, and assuming you're still building with the debug symbols included, then you could autogenerate the code to do it - but I don't believe there's any way of accessing local variables in the current stack frame via reflection.

Problem

My main question: I know you can generically output class fields with reflection, even if you do not know the variable names, types, or even how many there are. However, is there a way to list all variables within the current function or current scope, assuming I do not know what the variable names are? In other words: ``` 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". ``` I'd also be happy with an answer to this question: Let's say I'm allowed to store the names of all variables, does that help? 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"? ``` Why am I asking this? I am translating XYZ language(s) to java using ANTLR, and I would like to provide a simple method to output the entire state of the program at any point in time. Third possible solution I'd be happy with: If this is not possible in Java, is there any way I can write byte-code for a function that visits the calling function and examines the stack? This would also solve the problem. What would be amazing is if Java had the equivalent of Python's `eval()` or php's `get_defined_vars()`. If it makes a difference, I'm using Java 6, but anything for Java 5, 6, or 7 should be good. Thanks!

Original source

Related problems