( Редагувати: дві попередні відповіді видалено, одна для відповіді на запитання, коли вона стояла перед правками, і одна для того, щоб бути, якщо не зовсім помилковою, принаймні близько до неї. )
Якщо ви компілюєте інформацію про налагодження на ( 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; //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 Platform (JPDA) допоможе (але я ніколи цього не використовував).