2017-12-28 152 views
6

में ऑब्जेक्ट बनाने के लिए वास्तविक .class फ़ाइल का उपयोग करता है, मैं किसी विषय के बारे में उलझन में हूं और इसे वेब पर नहीं ढूंढ सकता। जैसा कि मैं इसे समझता हूं, जब प्रोग्राम शुरू होता है तो वर्ग लोडर .class फ़ाइलों को लोड करता है और Class प्रकार वाली वस्तुओं के रूप में स्मृति में उन्हें संग्रहीत करता है।जब हम नए ऑपरेटर का उपयोग करके ऑब्जेक्ट बनाते हैं, तो क्या यह जावा

Test test = new Test(); 

नई .class फ़ाइल का उपयोग कर, या स्मृति में पहले से ही Class वस्तु का उपयोग कर बनाई वस्तु है:

मेरा प्रश्न है जब हम उपयोग क्यों करें?

+2

मुझे लगता है कि अस्पष्ट हिस्सा है * जैसा कि मैं समझता हूं कि जब प्रोग्राम कक्षा लोडर शुरू करता है तो क्लास लोडर लोड करता है और उन्हें कक्षा में ऑब्जेक्ट के रूप में स्मृति में संग्रहीत करता है। * –

+0

क्या यह गलत है? यदि हां, तो क्या आप मुझे एक दिशा बता सकते हैं जहां मैं निष्पादन चक्र @YCF_L – rematnarab

उत्तर

5

एक बार कक्षा को JVM में लोड करने के बाद, एक ही कक्षा को उसी श्रेणी लोडर के लिए फिर से लोड नहीं किया जाएगा। नया उदाहरण क्लास ऑब्जेक्ट से मेमोरी (उसी क्लास लोडर के लिए) में बनाया जाएगा। उच्च स्तर (https://www.ibm.com/developerworks/java/tutorials/j-classloader/j-classloader.html से नकल)

  1. कॉल findLoadedClass पर

    कदम अगर पहले से ही वर्ग लोड को देखने के लिए।

  2. यदि कक्षा को लोड नहीं किया है, तो findClass (क्लास लोडर कार्यान्वयन द्वारा ओवरराइड) का उपयोग करके बाइट प्राप्त करें।
  3. यदि कच्चे बाइट मिले, तो कॉल क्लास ऑब्जेक्ट को क्लास ऑब्जेक्ट में बदलने के लिए कॉल करें। (AppClassLoader में उदाहरण)
  4. यदि कक्षा हल हो जाती है, क्लास ऑब्जेक्ट को हल करने के लिए resolClass को कॉल करें।
  5. यदि अभी भी कोई कक्षा नहीं है, तो ClassNotFoundException फेंक दें।

    protected synchronized Class<?> loadClass(String name, boolean resolve) 
    throws ClassNotFoundException 
    { 
        // First, check if the class has already been loaded 
        Class c = findLoadedClass(name); 
        if (c == null) { 
         try { 
          if (parent != null) { 
           c = parent.loadClass(name, false); 
          } else { 
           c = findBootstrapClass0(name); 
          } 
         } catch (ClassNotFoundException e) { 
          // If still not found, then invoke findClass in order 
          // to find the class. 
          c = findClass(name); 
         } 
        } 
        if (resolve) { 
         resolveClass(c); 
        } 
        return c; 
    } 
    

उदाहरण निम्नलिखित एक ही hashCode प्रिंट होगा के सभी और अधिक जानकारी के http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html?page=1

+0

'कच्चे बाइट्स को पा सकता हूं, परिभाषित क्लास को क्लास ऑब्जेक्ट में बदलने के लिए कॉल करें। 'तो इस बिंदु से उस क्लास ऑब्जेक्ट का उपयोग करके नए उदाहरण बनाए जाएंगे? और मेरे मामले में मैं test.class का उपयोग कर इसे एक्सेस कर सकता हूं? – rematnarab

+0

हां, आप क्लासलोडर से विरासत में अपना कस्टम क्लास लोड भी बना सकते हैं और कक्षा https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html – Kaushal

+0

ढूंढने का प्रयास कर सकते हैं दूसरे ' नया टेस्ट() 'अभिव्यक्ति, जेवीएम' लोड क्लास 'को भी कॉल नहीं करेगा, क्योंकि समान प्रतीकात्मक संदर्भ प्रति वर्ग केवल एक बार हल किए जाते हैं। यह सुनिश्चित करता है कि एक वर्ग के भीतर 'टेस्ट' के सभी संदर्भ हमेशा एक ही कक्षा में हल हो जाते हैं, भले ही आपने कस्टम क्लास लोडर को 'लोड क्लास' ओवरराइड करने के तरीके को अजीब चीजों के साथ ओवरराइड किया हो ... – Holger

1

एक वर्ग (.class) में लोड हो जाता है के लिए एक ही Test.class

Test test1 = new Test(); 
    Test test2 = new Test(); 
    System.out.println(test2.getClass().hashCode()); 
    System.out.println(test1.getClass().hashCode()); 
    System.out.println(Test.class.hashCode()); 

को संदर्भित करता है विधि क्षेत्र (1 प्रति जेवीएम)। यह ढेर का एक तार्किक हिस्सा भी है।

विधि क्षेत्र लोड प्रति निम्नलिखित डेटा संग्रहीत करता है:

तो अपने मामले में Test.class जब यह मुख्य विधि या निम्नलिखित संरचना में एक निर्भरता के रूप में कुछ अन्य वर्ग के माध्यम से भरी हुई है विधि क्षेत्र में मौजूद रहेंगे वर्ग: निरंतर पूल

  1. रन-टाइम
  2. क्षेत्र और विधि डेटा
  3. तरीकों और कंस्ट्रक्टर
  4. के लिए कोड

जब new Test() का सामना किया जाता है, तो टेस्ट क्लास का एक नया उदाहरण उस प्रकार के ढेर में बनाया जाएगा जो ऑब्जेक्ट ऑफ टाइप टेस्ट का प्रतिनिधित्व करता है।

enter image description here

Where does class, object, reference variable get stored in java. IN heap or stack? Where is heap or stack located?

ऊपर पोस्ट JVM में भंडारण सिद्धांत पर अधिक स्पष्ट रूप से बताते हैं।

+0

हैलो, उत्तर के लिए धन्यवाद .. बस से बचने के लिए भ्रम .. क्या विधि क्षेत्र में 'क्लास ऑब्जेक्ट (test.getClass()) है या क्या यह' compiled .class' फ़ाइल है जो Test.class फ़ाइल है? – rematnarab

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

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