( Edycja: usunięto dwie poprzednie odpowiedzi, jedną za udzielenie odpowiedzi na pytanie przed edycją, a drugą za bycie, jeśli nie absolutnie błędne, to przynajmniej blisko tego. )
Jeśli kompilujesz z informacjami debugowania w ( javac -g
), nazwy zmiennych lokalnych są przechowywane w pliku .class. Weźmy na przykład tę prostą klasę:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Po skompilowaniu z javac -g:vars TestLocalVarNames.java
, nazwy zmiennych lokalnych znajdują się teraz w pliku .class. javap
„s -l
flag («Broszura numer linii i lokalnych tabel zmienna») może je pokazać.
javap -l -c TestLocalVarNames
przedstawia:
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;
}
Specyfikacja maszyny wirtualnej wyjaśnia, co tu widzimy:
§4.7.9 LocalVariableTable
Atrybut :
LocalVariableTable
Cechą jest opcjonalna cecha o zmiennej długości Code
(§4.7.3) atrybutu. Może być używany przez debuggery do określenia wartości danej zmiennej lokalnej podczas wykonywania metody.
W LocalVariableTable
sklepach nazwy i typy zmiennych w każdej szczelinie, więc możliwe jest, aby dopasować je do kodu bajtowego z. W ten sposób debugery mogą wykonywać „Obliczanie wyrażenia”.
Jednak, jak powiedział Erickson, nie ma sposobu, aby uzyskać dostęp do tego stołu poprzez normalną refleksję. Jeśli nadal jesteś zdeterminowany, aby to zrobić, uważam, że architektura debugera platformy Java (JPDA) pomoże (ale nigdy jej nie używałem).