( แก้ไข: ลบคำตอบก่อนหน้านี้สองคำตอบสำหรับการตอบคำถามเนื่องจากอยู่ตรงหน้าการแก้ไขและอีกคำตอบถ้าไม่ผิดอย่างน้อยก็ใกล้เคียง )
หากคุณคอมไพล์ด้วยข้อมูลการดีบักบน ( 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) มันอาจจะถูกใช้โดย debuggers เพื่อกำหนดค่าของตัวแปรท้องถิ่นที่กำหนดในระหว่างการดำเนินการของวิธีการ
LocalVariableTable
ร้านค้าชื่อและประเภทของตัวแปรในแต่ละช่องเพื่อให้มันเป็นไปได้เพื่อให้ตรงกับพวกเขาด้วยโค้ดไบต์ นี่คือวิธีที่ผู้ดีบักสามารถ "ประเมินนิพจน์"
อย่างที่ erickson กล่าวแม้ว่าจะไม่มีวิธีการเข้าถึงตารางนี้ผ่านการสะท้อนกลับปกติ หากคุณยังคงตั้งใจที่จะทำสิ่งนี้ฉันเชื่อว่าJava Platform Debugger Architecture (JPDA)จะช่วยได้ (แต่ฉันไม่เคยใช้มันด้วยตนเอง)