2011-11-20 9 views
5

निरंतर पूल के संबंध में javap कमांड से उत्पन्न आउटपुट के बारे में थोड़ा सवाल। javap प्रिंट पूल है, जो मैं समझता हूँ कि यह Asciz तारों के रूप में स्ट्रिंग स्थिरांक को परिभाषित करता है इसका मतलब है जब null समाप्त Ascii:जावप असिज़ स्ट्रिंग्स

const #20 = Asciz  hello world; 

इसका अर्थ होता है कि स्ट्रिंग की लंबाई ज्ञात नहीं है, और पार्स करने के लिए आप प्रत्येक बाइट पढ़ें जब तक आप null का सामना नहीं करते हैं।

हालांकि, निरंतर पूल स्ट्रिंग स्थिरांक की लंबाई स्ट्रिंग से पहले दो बाइट्स द्वारा परिभाषित की जाती है और null संलग्न नहीं है। (Constant pool specification)।

javapAsciz के रूप में स्ट्रिंग को परिभाषित करता है या Asciz का कोई अन्य अर्थ है जिसके बारे में मुझे पता नहीं है?

उत्तर

4

देखें bug #6868539 देखें। यह OpenJDK7 में तय है, अब javap प्रिंट Utf8 इसके बजाय प्रिंट करता है।

+0

बिल्कुल सही, अच्छा खोज। – Jivings

0

कॉन्स्ट # 20 वास्तविक स्ट्रिंग नहीं है, बल्कि यूटीएफ 8 परिभाषित वर्ण आपकी स्ट्रिंग के लिए उपयोग किए जाते हैं। आपके पास शायद एक और स्थिरता है जो एक स्ट्रिंग है जो निरंतर # 20 का संदर्भ देती है। एसिज़ स्थिरांक अन्य चीजों के लिए फ़ील्ड नाम आदि जैसे तारों की तुलना में उपयोग किए जाते हैं। वास्तविक जानकारी में यूटीएफ 8 टैग, लंबाई और बाइट शामिल हैं।

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

+2

यह मेरी छोटी परिभाषा में वर्णित है। आप वास्तव में उसी संदर्भ से जुड़े हुए हैं जैसा मैंने किया था। तथ्य यह है कि यह एक यूटीएफ 8 स्ट्रिंग को परिभाषित करता है, और एएससीआईजेड स्ट्रिंग नहीं है जिसका मैं जिक्र कर रहा था। – Jivings

+0

चूंकि क्लास फ़ाइल प्रारूप विनिर्देश में शून्य समाप्त एसिसी स्ट्रिंग का कोई संदर्भ नहीं था, मैंने सोचा था कि आपका मतलब है कि पूल में स्ट्रिंग्स को कैसे परिभाषित किया गया था। (यहां तक ​​कि 1.0 विनिर्देशों में भी कोई असीसी स्ट्रिंग नहीं है, बल्कि यूनिकोड है। उनमें से कोई भी शून्य समाप्त नहीं हुआ है)। जिविंग्स आपके प्रश्न को मुझसे बेहतर समझने लगते थे। –

+0

बस, मैं क्या जानना चाहता था कि उन्हें निरंतर पूल में असीज़ नाम क्यों दिया जाता है जब वे स्पष्ट रूप से समाप्त नहीं होते हैं। – Jivings