Abrufen lokaler Variablen aus einem Stapelrahmen auf der JVM

8

Gibt es eine Möglichkeit, eine Map oder andere Datenstruktur der lokalen Variablen im aktuellen Bereich in der JVM zu erhalten, ohne einen Debugger zu verwenden? Das heißt, um die Einheimischen des aktuellen Stack-Frame zu bekommen?

Ich weiß, dass es Stacktrace-Objekte gibt, aber StackTraceElement hat keine Möglichkeit, auf irgendeinen Status zuzugreifen. Es sagt nur, welche Methode wo genannt wurde, aber nicht was drin war.

    
bobpoekert 31.08.2009, 19:35
quelle

2 Antworten

4

Variablennamen können in Klassendateien enthalten sein, um Debuggern zu helfen, aber javac tut dies standardmäßig nicht. Es erfordert die Option -g:vars .

Wenn es vorhanden ist, könnte ein Programm eine Byte-Code-Engineering-Bibliothek wie ASM verwenden, um auf die lokalen Variablennamen und den Bereich zuzugreifen.

Während diese Frage schlecht ist Ich denke, es ist ein Duplikat, und seine Antworten können für Ihr Problem relevant sein. Ich würde hinzufügen, dass, wenn Sie sich nicht um die Namen kümmern, der lokale Variablentyp und -bereich immer in der Attributtabelle jeder Methode enthalten sind.

    
erickson 31.08.2009, 19:42
quelle
1

Ich glaube nicht, dass es einen Weg gibt, dies zu tun. Der Compiler ist immer frei, lokale Variablen zu optimieren, und die Bereitstellung einer solchen Methode würde verhindern, dass der Compiler diese Art der Optimierung ausnutzt. Beim Kompilieren einer Methode kann der Compiler nicht feststellen, ob Sie eine hypothetische getLocalVariables() irgendwo anders im Programm aufgerufen haben, also müssten alle deklarierten lokalen Variablen immer in eine solche Map eingefügt werden.

    
Greg Hewgill 31.08.2009 19:39
quelle

Tags und Links