( Изменить: два предыдущих ответа удалены, один для ответа на вопрос, как он стоял до редактирования, и один, если не совсем неверен, по крайней мере, близок к нему. )
Если вы компилируете с отладочной информацией на ( 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
«S -l
флаг („Печать номер строки и таблицы локальных переменных“) может показать их.
javap -l -c TestLocalVarNames
показывает:
class TestLocalVarNames extends java.lang.Object{
TestLocalVarNames();
Code:
0: aload_0
1: invokespecial #1;
4: return
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LTestLocalVarNames;
public java.lang.String aMethod(int);
Code:
0: ldc #2;
2: astore_2
3: new #3;
6: dup
7: invokespecial #4;
10: astore_3
11: aload_3
12: aload_2
13: invokevirtual #5;
16: iload_1
17: invokevirtual #6;
20: invokevirtual #7;
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;
}
Спецификация виртуальной машины объясняет, что мы здесь видим:
§4.7.9 LocalVariableTable
Атрибут :
LocalVariableTable
Атрибут является необязательным атрибутом переменной длины из Code
(§4.7.3) атрибута. Он может использоваться отладчиками для определения значения данной локальной переменной во время выполнения метода.
В LocalVariableTable
хранит имена и типы переменных в каждом временном интервале, так что можно сопоставить их с байткод. Вот как отладчики могут выполнять «Оценить выражение».
Однако, как сказал Эриксон, нет возможности получить доступ к этой таблице через обычное отражение. Если вы по-прежнему полны решимости сделать это, я считаю, что архитектура отладчика платформы Java (JPDA) поможет (но я никогда не использовал ее сам).