( Düzenleme: Önceki iki cevaplar o düzenlemeleri önüne çıkıp olduğu için bir olarak kesinlikle yanlış değilse kendisine en kapanışında, soruya cevap için, bir tane kaldırıldı. )
( javac -g
) Üzerindeki hata ayıklama bilgileri ile derlerseniz , yerel değişkenlerin adları .class dosyasında tutulur. Örneğin, şu basit sınıfı alın:
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
İle derlendikten sonra , yerel değişkenlerin adları şimdi .class dosyasındadır. javap
'nin -l
bayrağı ("Baskı satırı numarası ve yerel değişken tabloları") bunları gösterebilir.
javap -l -c TestLocalVarNames
gösterileri:
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 Spec burada gördüğümüz şey açıklıyor:
§4.7.9 LocalVariableTable
Özellik :
LocalVariableTable
Özelliği, bir isteğe bağlı bir değişken uzunluklu özniteliktir Code
(§4.7.3) öznitelik. Hata ayıklayıcılar tarafından, bir yöntemin yürütülmesi sırasında belirli bir yerel değişkenin değerini belirlemek için kullanılabilir.
LocalVariableTable
Mağaza isimleri ve her bir yuvaya değişkenlerin tipleri, nedenle bayt ile onları maç mümkündür. Hata ayıklayıcılar "İfadeyi değerlendir" i bu şekilde yapabilir.
Ericson'un dediği gibi, bu tabloya normal yansıma ile erişmenin bir yolu yoktur. Hala bunu yapmaya kararlıysanız, Java Platform Hata Ayıklayıcı Mimarisinin (JPDA) yardımcı olacağına inanıyorum (ancak bunu hiç kullanmadım).