मैं एक बाइटकोड उपकरण लिख रहा हूं। अभी, मैं यह पता लगाने की कोशिश कर रहा हूं कि वस्तुओं की उपस्थिति में इसे कैसे किया जाए। मैं दो पंक्तियों मैं JVMs में पढ़ा (खंड 4.9.4) पर कुछ स्पष्टीकरण चाहते हैं:बाइटकोड और ऑब्जेक्ट्स पर स्पष्टीकरण
1) "सत्यापनकर्ता कोड नई वस्तु से पहले यह किया गया है प्रारंभ का उपयोग करता है को खारिज कर दिया।"
मेरा सवाल है, "उपयोग" का अर्थ यहां क्या है? मैं अनुमान लगा रहा हूं कि इसका मतलब है: इसे एक विधि विशेषता के रूप में पास करना, GETFIELD
और PUTFIELD
पर कॉल करना, या उस पर किसी भी इंस्टेंस विधि को कॉल करना। क्या उनके अन्य वर्जित उपयोग हैं? और मेरा मानना है कि यह DUP
, LOAD
और STORE
जैसे अन्य निर्देशों का पालन करता है।
2) "उस विधि myClass का एक और उदाहरण प्रारंभ विधि या इस पर इसके प्रत्यक्ष सुपर क्लास, केवल आपरेशन विधि क्षेत्रों myClass भीतर घोषित बताए है इस पर प्रदर्शन कर सकते हैं का आह्वान करने से पहले।"
जिसका मतलब है कि एक <init>
विधि में, GETFIELD और PUTFIELD एक और <init>
कहा जाता है से पहले अनुमति दी जाती है। हालांकि, जावा में, super()
या this()
पर कॉल से पहले एक उदाहरण फ़ील्ड पर किसी भी ऑपरेशन को संकलन त्रुटि में परिणाम देता है। क्या कोई इसे स्पष्ट कर सकता है?
3) मेरे पास एक और सवाल है। ऑब्जेक्ट संदर्भ कब प्रारंभ होता है, और इसलिए, स्वतंत्र रूप से उपयोग करने के लिए तैयार है? जेवीएमएस पढ़ने से, मैं जवाब के साथ आया कि क्या एक वस्तु शुरू की गई है या नहीं, प्रत्येक विधि तक है। समय में एक निश्चित बिंदु पर, वस्तु को विधि के लिए शुरू किया जा सकता है लेकिन दूसरे के लिए नहीं। विशेष रूप से, उस विधि के लिए एक ऑब्जेक्ट प्रारंभ होता है जब उस विधि रिटर्न द्वारा <init>
कहा जाता है।
उदाहरण के लिए, मान लें कि main()
विधि ने एक ऑब्जेक्ट बनाया और <init>
कहा जिसे बाद में सुपरक्लास के <init>
कहा जाता है। super()
से लौटने के बाद, ऑब्जेक्ट को अब <init>
द्वारा प्रारंभ किया गया है, लेकिन अभी तक main()
के लिए प्रारंभ नहीं किया गया है। इसका मतलब है, <init>
में super()
के बाद, मैं ऑब्जेक्ट को एक विधि के पैरामीटर के रूप में पास कर सकता हूं, यहां तक कि मुख्य() से लौटने से पहले भी।
क्या कोई यह पुष्टि कर सकता है कि यह संपूर्ण विश्लेषण सत्य है? आपके समय के लिए शुक्रिया।
ps: मैंने वास्तव में सूर्य मंचों पर एक ही प्रश्न पोस्ट किया है लेकिन प्रतिक्रिया के साथ। मुझे आशा है कि मुझे यहां और अधिक भाग्य मिलेगा। धन्यवाद।
अद्यतन
सबसे पहले अपने जवाब के लिए और समय के लिए धन्यवाद। हालांकि मुझे स्पष्ट जवाब नहीं मिला (मेरे पास कई प्रश्न थे और उनमें से कुछ थोड़ा अस्पष्ट थे), आपके उत्तर और उदाहरण, और बाद के प्रयोग, जेवीएम काम करता है और अधिक गहराई से समझने के लिए मेरे लिए बेहद उपयोगी थे।
मुख्य बात मैंने पाया है कि सत्यापनकर्ता का व्यवहार विभिन्न कार्यान्वयन और संस्करणों से भिन्न होता है (जो बाइटकोड मैनिपुलेशन का काम अधिक जटिल बनाता है)।समस्या या तो जेवीएमएस के अनुरूप नहीं है, या सत्यापनकर्ता के डेवलपर्स से दस्तावेज़ीकरण की कमी है, या जेवीएमएस के सत्यापनकर्ता क्षेत्र में कुछ सूक्ष्म अस्पष्टता है।
एक आखिरी बात, एसओ रॉक्स !!! मैंने आधिकारिक सूर्य जेवीएम निर्दिष्टीकरण मंच में एक ही प्रश्न पोस्ट किया, और मुझे अब तक कोई जवाब नहीं मिला है।
यह एक बुरा विचार नहीं है, लेकिन आप इस के साथ सावधान रहना चाहिए । अतीत में वास्तविक सत्यापनकर्ता विनिर्देशों के मुकाबले नियमों के बारे में कम सख्त होता था। यह पूरी तरह से संभव है कि ऐसे मामले अभी भी होते हैं। –
हां, मैंने पाया कि सत्यापनकर्ता के विभिन्न कार्यान्वयन में कठोरता का अलग-अलग स्तर है। उदाहरण के लिए, अपाचे बीसीईएल का जस्टिस सत्यापनकर्ता स्टोर को अनियमित ऑब्जेक्ट रेफरेंस पर अनुमति नहीं देता है, जबकि जावा हॉटस्पॉट 10.0 –