2009-11-19 6 views
6

एक जावा क्लास की कल्पना करें जिसमें सबसे अधिक सुविधाएं हैं जो आप कक्षा में पा सकते हैं। उदाहरण के लिए: यह किसी अन्य वर्ग से प्राप्त होता है, कुछ इंटरफेस लागू करता है, इसमें कुछ 'स्थिर अंतिम' स्थिरांक, कुछ अंतिम स्थिरांक, कुछ स्थैतिक चर, आवृत्ति चर, एक स्थिर ब्लॉक, एक अनाम कोड ब्लॉक (केवल कोड {}) शामिल है, कन्स्ट्रक्टर, विधियां इत्यादिकक्षा के विभिन्न हिस्सों को जेवीएम में लोड होने पर किस क्रम में प्रारंभ किया जाता है?

जब प्रश्न में कक्षा पहली बार जेवीएम में लोड हो जाती है, कक्षा के विभिन्न हिस्सों को जेवीएम में शुरू या लोड किया जाता है? JVM में कॉल स्टैक लोडिंग के लिए कैसा दिखता है? मान लें कि केवल एक क्लासलोडर यहां काम पर है।

यह जावा के पूर्ण मूलभूत/आंतरिक पर वापस जा रहा है, लेकिन मैं सही अनुक्रम समझाते हुए एक अच्छा आलेख ढूंढने में सक्षम हूं।

उत्तर

1

JLS, विशेष रूप से धारा 12.4 के बारे में कैसे?

+0

असली चिकनी ... :) इच्छा है कि मेरे पास जेएलएस पहुंचने के लिए सही Google खोज शब्द था! ने मुझे अभी भी मारा है कि मैं ग्रहण डीबगर के माध्यम से इसे चलाने में सक्षम हो सकता हूं ... :( – Thimmayya

3

इस खंड में वर्णित किया जा सकता है 2.17.4 of the JVMS 5.0/6

2.17.4 प्रारंभ

एक वर्ग के प्रारंभ के होते हैं: अपनी स्थिर initializers (§2.11) और को क्रियान्वित करने

  • वर्ग में घोषित स्थैतिक क्षेत्रों (§2.9.2) के प्रारंभकर्ता।

इंटरफ़ेस के आरंभ में इंटरफ़ेस में घोषित फ़ील्ड के लिए प्रारंभकर्ताओं को निष्पादित करने (§2.13.3.1) शामिल हैं।

कक्षा या इंटरफ़ेस प्रारंभ होने से पहले, इसका प्रत्यक्ष सुपरक्लास प्रारंभ होना चाहिए, लेकिन कक्षा द्वारा कार्यान्वित इंटरफेस को प्रारंभ नहीं किया जाना चाहिए। इसी प्रकार, इंटरफ़ेस प्रारंभ होने से पहले इंटरफ़ेस के सुपरइंटरफेस को प्रारंभ नहीं किया जाना चाहिए।

एक वर्ग या इंटरफ़ेस प्रकार टी तुरंत प्रारंभ हो जाएगा निम्न में से एक से पहले होता है:

  • टी एक वर्ग है और टी का एक उदाहरण बन जाता है।
  • टी एक वर्ग है और टी की स्थैतिक विधि लागू की जाती है।
  • टी का एक गैर-स्थिर स्थिर क्षेत्र उपयोग या असाइन किया गया है। एक स्थिर क्षेत्र वह है जो (स्पष्ट रूप से या स्पष्ट रूप से) दोनों अंतिम और स्थैतिक है, और यह संकलन-समय निरंतर अभिव्यक्ति के मूल्य के साथ प्रारंभ किया जाता है। इस तरह के क्षेत्र का संदर्भ संकलन समय स्थिर संकलन की प्रतिलिपि में संकलित समय पर हल किया जाना चाहिए, इसलिए ऐसे क्षेत्र का उपयोग प्रारंभिकरण का कारण नहीं बनता है।

लाइब्रेरी कक्षाओं (§3.12) में कुछ विधियों का आमंत्रण कक्षा या इंटरफ़ेस प्रारंभिक कारण भी बनता है। विवरण के लिए जावा 2 प्लेटफॉर्म के क्लास लाइब्रेरी विनिर्देशों (उदाहरण के लिए, क्लास क्लास और पैकेज java.lang.reflect) देखें।

इस उद्देश्य का उद्देश्य यह है कि एक प्रकार के प्रारंभकर्ताओं का एक सेट होता है जो इसे एक सतत स्थिति में रखता है और यह राज्य दूसरे वर्गों द्वारा देखा जाने वाला पहला राज्य होता है। स्थैतिक प्रारंभकर्ताओं और वर्ग परिवर्तनीय प्रारंभिक पाठकों को क्रमिक क्रम में निष्पादित किया जाता है और कक्षा में घोषित कक्षा चर का उल्लेख नहीं किया जा सकता है जिनकी घोषणा उपयोग के बाद पाठ रूप से दिखाई देती है, भले ही इन वर्ग चर के दायरे में हों।यह प्रतिबंध संकलित समय, सबसे परिपत्र या अन्यथा विकृत प्रारंभिकताओं का पता लगाने के लिए डिज़ाइन किया गया है।

कक्षा या इंटरफेस शुरू होने से पहले इसके सुपरक्लास को प्रारंभ किया गया है, अगर इसे पहले शुरू नहीं किया गया है।


Initialization in JVMS 8 is in Chapter 5.5

कक्षा या अंतरफलक के प्रारंभ के अद्यतन संस्करण अपने वर्ग या इंटरफ़ेस प्रारंभ विधि (§2.9) को क्रियान्वित करने के होते हैं।

एक वर्ग या इंटरफ़ेस

केवल का एक परिणाम के रूप में प्रारंभ किया जा सकता है:

  • जावा वर्चुअल मशीन निर्देश new, getstatic, putstatic में से किसी एक या invokestatic वर्ग या इंटरफ़ेस का संदर्भ देता है के निष्पादन (§new , §getstatic, §putstatic, §invokestatic)।
    ये सभी निर्देश किसी क्षेत्र संदर्भ या विधि संदर्भ के माध्यम से सीधे या परोक्ष रूप से कक्षा को संदर्भित करते हैं।
    एक नए निर्देश के निष्पादन पर, संदर्भित कक्षा या इंटरफ़ेस प्रारंभ किया गया है यदि इसे पहले से प्रारंभ नहीं किया गया है।
    getstatic, putstatic, या invokestatic निर्देश, निष्पादित क्षेत्र या विधि को घोषित करने वाले वर्ग या इंटरफ़ेस को प्रारंभ करने पर पहले ही प्रारंभ नहीं किया गया है।
  • एक java.lang.invoke.MethodHandle उदाहरण है, जिसमें जावा आभासी मशीन (§5.4.3.5) और जिसके द्वारा एक विधि संभाल के संकल्प का परिणाम था की पहली मंगलाचरण 2 का एक प्रकार (REF_getStatic), 4 (REF_putStatic), 6 (REF_invokeStatic) है, या 8 (REF_newInvokeSpecial)।
  • कक्षा पुस्तकालय (§2.12) में कुछ प्रतिबिंबित तरीकों का आमंत्रण, उदाहरण के लिए, कक्षा Class या पैकेज java.lang.reflect में।
  • इसके उप-वर्गों में से एक का प्रारंभिकरण।
  • जावा वर्चुअल मशीन स्टार्ट-अप (§5.2) में प्रारंभिक कक्षा के रूप में इसका पदनाम।

पहले प्रारंभ करने के लिए, एक वर्ग या इंटरफ़ेस से जुड़ा हुआ होना चाहिए, कि है, सत्यापित, तैयार, और वैकल्पिक रूप संकल्प लिया।

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

जावा वर्चुअल मशीन का कार्यान्वयन निम्न प्रक्रिया का उपयोग करके सिंक्रनाइज़ेशन और रिकर्सिव प्रारंभिक देखभाल की देखभाल के लिए ज़िम्मेदार है।
यह मानता है कि Class वस्तु पहले से सत्यापित किया गया है और तैयार है, और Class वस्तु का कहना है कि चार स्थितियों में से एक को इंगित करता है जिसमें:

  • यह Class वस्तु सत्यापित और तैयार लेकिन प्रारंभ नहीं किया गया है।
  • यह Class ऑब्जेक्ट कुछ विशेष धागे द्वारा शुरू किया जा रहा है।
  • यह Class ऑब्जेक्ट पूरी तरह से प्रारंभ किया गया है और उपयोग के लिए तैयार है।
  • यह Class ऑब्जेक्ट एक गलत स्थिति में है, शायद क्योंकि प्रारंभिकरण का प्रयास किया गया था और विफल रहा था।
+0

+1 आपके अपडेट के लिए। – sunleo

संबंधित मुद्दे