( Sunting: dua jawaban sebelumnya dihapus, satu untuk menjawab pertanyaan seperti yang berdiri sebelum pengeditan dan satu untuk menjadi, jika tidak sepenuhnya salah, setidaknya dekat dengan itu. )
Jika Anda mengompilasi dengan informasi debug pada ( javac -g
), nama-nama variabel lokal disimpan dalam file .class. Sebagai contoh, ambil kelas sederhana ini:
class TestLocalVarNames {
public String aMethod(int arg) {
String local1 = "a string";
StringBuilder local2 = new StringBuilder();
return local2.append(local1).append(arg).toString();
}
}
Setelah dikompilasi dengan javac -g:vars TestLocalVarNames.java
, nama-nama variabel lokal sekarang di file .class. javap
's -l
bendera ( 'Cetak nomor baris dan tabel variabel lokal') dapat menunjukkan kepada mereka.
javap -l -c TestLocalVarNames
menunjukkan:
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;
}
Spesifikasi VM menjelaskan apa yang kami lihat di sini:
§4.7.9 LocalVariableTable
Atribut :
The LocalVariableTable
atribut opsional variabel-panjang atribut dari Code
(§4.7.3) atribut. Ini dapat digunakan oleh debuggers untuk menentukan nilai variabel lokal yang diberikan selama eksekusi suatu metode.
The LocalVariableTable
menyimpan nama dan jenis variabel dalam setiap slot, sehingga memungkinkan untuk mencocokkan mereka dengan bytecode. Ini adalah bagaimana para pengadu dapat melakukan "Mengevaluasi ekspresi".
Seperti yang dikatakan erickson, tidak ada cara untuk mengakses tabel ini melalui refleksi normal. Jika Anda masih bertekad untuk melakukan ini, saya percaya Java Platform Debugger Architecture (JPDA) akan membantu (tapi saya tidak pernah menggunakannya sendiri).