( Bearbeiten: Zwei vorherige Antworten wurden entfernt, eine für die Beantwortung der Frage, wie sie vor der Bearbeitung stand, und eine, um, wenn nicht absolut falsch, zumindest nahe daran zu sein. )
Wenn Sie mit Debug-Informationen zu ( javac -g
) kompilieren , werden die Namen lokaler Variablen in der .class-Datei gespeichert. Nehmen Sie zum Beispiel diese einfache Klasse:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Nach dem Kompilieren mit befinden javac -g:vars TestLocalVarNames.java
sich die Namen der lokalen Variablen jetzt in der .class-Datei. javap
Das -l
Flag ("Zeilennummer und lokale Variablentabellen drucken") kann sie anzeigen.
javap -l -c TestLocalVarNames
zeigt an:
class TestLocalVarNames extends java.lang.Object{
TestLocalVarNames();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestLocalVarNames;
public java.lang.String aMethod(int);
Code:
0: ldc #2; //String a string
2: astore_2
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: astore_3
11: aload_3
12: aload_2
13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: iload_1
17: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
20: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 24 0 this LTestLocalVarNames;
0 24 1 arg I
3 21 2 local1 Ljava/lang/String;
11 13 3 local2 Ljava/lang/StringBuilder;
}
Die VM-Spezifikation erklärt, was wir hier sehen:
§4.7.9 Das LocalVariableTable
Attribut :
Das LocalVariableTable
Attribut ist ein optionales Attribut variabler Länge eines Code
(§4.7.3) Attributs. Es kann von Debuggern verwendet werden, um den Wert einer bestimmten lokalen Variablen während der Ausführung einer Methode zu bestimmen.
Das LocalVariableTable
speichert die Namen und Typen der Variablen in jedem Slot, so dass es möglich ist, sie mit dem Bytecode abzugleichen. Auf diese Weise können Debugger "Ausdruck auswerten" ausführen.
Wie erickson sagte, gibt es jedoch keine Möglichkeit, durch normale Reflexion auf diese Tabelle zuzugreifen. Wenn Sie immer noch entschlossen sind, dies zu tun, wird die Java Platform Debugger Architecture (JPDA) meiner Meinung nach helfen (aber ich habe sie selbst nie verwendet).