( Modifica: due risposte precedenti rimosse, una per rispondere alla domanda prima delle modifiche e una per essere, se non assolutamente sbagliata, almeno vicino ad essa. )
Se si compila con le informazioni di debug su ( javac -g
), i nomi delle variabili locali vengono conservati nel file .class. Ad esempio, prendi questa semplice classe:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Dopo la compilazione con javac -g:vars TestLocalVarNames.java
, i nomi delle variabili locali sono ora nel file .class. javap
il -l
flag ("Stampa il numero di riga e le tabelle delle variabili locali") può mostrarli.
javap -l -c TestLocalVarNames
Spettacoli:
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;
}
Le specifiche della VM spiegano cosa stiamo vedendo qui:
§4.7.9 L' LocalVariableTable
attributo :
L' LocalVariableTable
attributo è un attributo opzionale a lunghezza variabile di un attributo Code
(§4.7.3). Può essere utilizzato dai debugger per determinare il valore di una determinata variabile locale durante l'esecuzione di un metodo.
I LocalVariableTable
negozi i nomi ei tipi delle variabili in ogni slot, quindi è possibile abbinare il tutto con il bytecode. Ecco come i debugger possono fare "Valuta espressione".
Come ha detto Erickson, tuttavia, non c'è modo di accedere a questa tabella attraverso la normale riflessione. Se sei ancora determinato a farlo, credo che la Java Platform Debugger Architecture (JPDA) ti aiuterà (ma non l'ho mai usato da solo).