2015-12-08 17 views
10

मुझे UrlClassLoader प्रतिनिधिमंडल पदानुक्रम और विरासत पदानुक्रम के साथ उलझन में डाल दिया गया है। मैंने कक्षा बनाई जो UrlClassLoader को बढ़ाता है और निष्पादित: childOfUrlClassLoader.getParent().getClass().getName() जिसने मुझे दिया: sun.misc.Launcher$AppClassLoader। इस के बाद मैं एक यात्रा करने के लिए वर्ग (source) ऊपर उल्लेख कियाUrlClassLoader प्रतिनिधिमंडल और विरासत पदानुक्रम

249 static class AppClassLoader extends URLClassLoader { 
     //... 
308  protected synchronized Class<?> loadClass(String name, boolean resolve) 
309   throws ClassNotFoundException 
310  { 
311   // First, check if the class has already been loaded 
312   Class c = findLoadedClass(name); 
313   if (c == null) { 
314    try { 
315     if (parent != null) { 
316      c = parent.loadClass(name, false); 
317  
      // ... 
329   return c; 
330  } 

तब मैं जाँच की जो AppClassLoader की एक माता पिता है भुगतान करते हैं। अनुमानतः मुझे sun.misc.Launcher$ExtClassLoader मिला और ExtClassLoader का अभिभावक null है।

1) कौन मेरी कक्षा लोड करता है के बाद से AppClassLoader.loadClass का कोड लाइन

294 return (super.loadClass(name, resolve)); 

यह पाश की तरह लग रहा है, यह नहीं है:


मैं कुछ प्रश्न हैं?

2) क्यों ExtClassLoader BootstrapClassLoader एक अभिभावक के रूप में नहीं है, लेकिन null है?

3) किस उद्देश्य के लिए AppClassLoader क्लास UrlClassLoader का विस्तार करता है?

उत्तर

7

प्रतिनिधि-पहला मॉडल

निर्माण में जावा ClassLoaders एक प्रतिनिधि-पहला मॉडल का पालन करें। इसका अर्थ यह है कि क्लासलोडर अपने माता-पिता को इसे लोड करने से पहले कक्षा को लोड करने की अनुमति देगा। लोडर के पदानुक्रम में शीर्ष पर बूटस्ट्रैप लोडर होता है, उसके बाद एक्सटेंशन क्लासलोडर, एप्लिकेशन क्लासलोडर होता है। एप्लिकेशन क्लासलोडर के तहत URLClassLoaders और एप्लिकेशन द्वारा बनाए गए किसी अन्य लोडर को पाया जा सकता है।

बूटस्ट्रैप क्लासलोडर rt.jar से फ़ाइलों को लोड कर सकता है जिसमें java.lang, java.io, java.util और java.net संकुल सहित सबसे आवश्यक जावा कक्षाएं शामिल हैं। एक्सटेंशन क्लासलोडर जावा इंस्टॉलेशन में अन्य जार फ़ाइलों से कक्षाएं लोड करता है। यह एप्लिकेशन क्लासलोडर है जो क्लासपाथ पर पाए गए वर्गों को लोड करता है और जब कोई एप्लिकेशन प्रारंभ होता है तो वर्तमान क्लासलोडर होता है।

कार्रवाई में

लोड हो रहा है

तो क्या हुआ जब एक आवेदन एक HashMap लोड करने के लिए चाहता है क्या होता है? वर्तमान क्लासलोडर को हैश मैप वर्ग लोड करने के लिए कहा जाता है। कुछ भी करने से पहले, यह कक्षा को लोड करने के लिए अपने माता-पिता, एक्सटेंशन क्लासलोडर से पूछता है। बदले में एक्सटेंशन क्लासलोडर बूटस्ट्रैप क्लासलोडर को भेजता है जो वर्ग को rt.jar में पाता है और इसे लोड करता है।

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

classloader कैश

व्यवहार में प्रत्येक classloader एक कैश जहां पहले से ही भरी हुई कक्षाएं जमा हो जाती है है और कैश माता-पिता को सौंपने के पहले की खोज कर रहा है, लेकिन यह पहली सौंपने के सिद्धांत को नहीं बदलता है।

यह जहां कैश

Class c = findLoadedClass(name); 

URLClassLoaders

एक आवेदन के द्वारा बनाई गई एक अभिभावक के रूप आवेदन classloader होगा एक URLClassLoader चेक किया गया है है। यदि यह प्रतिनिधि-प्रथम मॉडल का पालन करता है, तो कक्षाएं आपूर्ति किए गए यूआरएल से पहले कक्षा में पाए जाएंगी।

प्रश्न

1) कौन मेरी कक्षा लोड करता है

मैं अपने लिंक

309   // First, check if the class has already been loaded 
310   Class c = findLoadedClass(name); 
311   if (c == null) { 
312    try { 
313     if (parent != null) { 
314      c = parent.loadClass(name, false); 
315     } else { 
316      c = findBootstrapClass0(name); 
317     } 
318    } catch (ClassNotFoundException e) { 
319     // If still not found, then invoke findClass in order 
320     // to find the class. 
321     c = findClass(name); 
322    } 
323   } 

में थोड़ा अलग कोड को देखने के एक वर्ग के माता-पिता द्वारा लोड नहीं है, तो फेंक देता है एक ClassNotFoundException जो पकड़ा जाता है और वर्तमान क्लासलोडर को कक्षा

321     c = findClass(name); 
को खोजने की अनुमति देता है

2) ExtClassLoader के पास माता-पिता के रूप में BootstrapClassLoader क्यों नहीं है, लेकिन शून्य है?

इस वर्ग के लिए वर्ग लोडर getClassLoader API

[getClassLoader()] रिटर्न द्वारा उत्तर दिया है। कुछ कार्यान्वयन बूटस्ट्रैप क्लास लोडर का प्रतिनिधित्व करने के लिए शून्य का उपयोग कर सकते हैं।

3) किस उद्देश्य के लिए AppClassLoader क्लास UrlClassLoader का विस्तार करता है?

इस बात पर विचार करें कि एप्लिकेशन क्लासलोडर विशेष नहीं है कि यह उपयोगकर्ता द्वारा प्रदान की जाने वाली कक्षाओं को लोड करता है, सिस्टम कक्षाओं में नहीं। क्लासपाथ प्रभावी ढंग से यूआरआई की एक सूची है, इसलिए एक URLClassLoader एक उपयुक्त सुपरक्लास है।

संदर्भ

वहाँ

सहित classloading पर कई लेख हैं
संबंधित मुद्दे