( संपादित करें: पिछले दो उत्तर हटा दिए गए, एक प्रश्न के उत्तर के लिए, क्योंकि यह संपादन से पहले खड़ा था और एक होने के लिए, यदि बिल्कुल गलत नहीं है, तो कम से कम इसके करीब। )
यदि आप डिबग जानकारी ( 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
का -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;
}
वीएम कल्पना बताते हैं कि हम यहाँ क्या देख रहे हैं:
§4.7.9 LocalVariableTable
गुण :
LocalVariableTable
विशेषता एक का एक वैकल्पिक चर लंबाई विशेषता है Code
(§4.7.3) विशेषता। किसी विधि के निष्पादन के दौरान किसी दिए गए स्थानीय चर का मान निर्धारित करने के लिए डीबगर्स द्वारा इसका उपयोग किया जा सकता है।
LocalVariableTable
स्टोर के नामों और प्रत्येक स्लॉट में चर के प्रकार, तो यह बाईटकोड के साथ उन्हें मैच के लिए संभव है। यह है कि डिबगर "अभिव्यक्ति का मूल्यांकन" कैसे कर सकते हैं।
जैसा कि एरिकसन ने कहा, हालांकि, सामान्य प्रतिबिंब के माध्यम से इस तालिका तक पहुंचने का कोई तरीका नहीं है। यदि आप अभी भी ऐसा करने के लिए दृढ़ हैं, मेरा मानना है कि जावा प्लेटफ़ॉर्म डीबगर आर्किटेक्चर (JPDA) मदद करेगा (लेकिन मैंने इसे स्वयं कभी इस्तेमाल नहीं किया है)।