( Редактировать: два предыдущих ответа удалены: один для ответа на вопрос в том виде, в каком он стоял до правок, и другой за то, что он был, если не абсолютно неправ, по крайней мере близок к нему. )
Если вы компилируете с отладочной информацией о (javac -g
), имена локальных переменных сохраняются в файле .class. Например, возьмите этот простой класс:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
После компиляции с javac -g:vars TestLocalVarNames.java
имена локальных переменных теперь находятся в файле .class. Флаг javap
-l
(«Печать номера строки и таблиц локальных переменных») может показать их.
javap -l -c TestLocalVarNames
показывает:
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;
}
Спецификация VM объясняет, что мы видим здесь:
§4.7.9 Атрибут LocalVariableTable
:
Атрибут LocalVariableTable
является необязательным атрибутом переменной длины для атрибута Code
(§4.7.3). Он может использоваться отладчиками для определения значения данной локальной переменной во время выполнения метода.
LocalVariableTable
хранит имена и типы переменных в каждом слоте, поэтому их можно сопоставить с байт-кодом. Вот как отладчики могут выполнять «Оценивать выражение».
Однако, как сказал Эриксон, нет никакого способа получить доступ к этой таблице через обычное отражение. Если вы все еще намерены это сделать, я считаю, что Архитектура отладчика платформы Java (JPDA) поможет (но я никогда не использовал ее сам).