2011-12-09 10 views
8

हाय दोस्तों: मैं कुछ गतिशील रूप से बनाए गए घटकों के लिए ClassLoader एस देख कर एक बहुत ही अजीब वर्ग त्रुटि को डीबग करने का प्रयास कर रहा हूं। ClassLoader एस कुछ ऐसा है जो मैंने कभी नहीं खेला है - और मुझे हैरान है कि मानक जेडीके कक्षाओं में शून्य क्लास लोडर उदाहरण हैं।स्टॉक जेडीके कक्षाएं और "शून्य" क्लासलोडर?

किसी वर्गों जिसका लोडर मैं और अधिक आम तौर पर मुद्रित करने के लिए प्रयास कर रहा हूँ, और भी के मामले में इस सरल मुख्य विधि के उत्पादन में व्याख्या कर सकते हैं -

  1. JVM पर जिस तरह से ClassLoader काम और
  2. हम ClassLoader एस का उपयोग कर गायब कक्षाओं को कैसे डिबग कर सकते हैं।
public class MyClass { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     System.out.println(relfect.MyClass.class.getClassLoader()); 
     System.out.println(String.class.getClassLoader()); 
     System.out.println(ArrayList.class.getClassLoader()); 
     System.out.println(JButton.class.getClassLoader()); 
     System.out.println(System.class.getClassLoader()); 

     Boolean b = new Boolean(true); 
     System.out.println(b.getClass().getClassLoader()); 

    } 

} 

आउटपुट

[email protected] 
null 
null 
null 
null 
null 
+0

यह प्रश्न ऑफ-विषय प्रतीत होता है क्योंकि स्टैक ओवरव्लो छोटे जेडीके दस्तावेज़ों के लिए एक विकल्प नहीं है। –

उत्तर

18

के लिए getClassLoader() जावाडोक

रिटर्न वर्ग के लिए वर्ग लोडर कहते हैं। कुछ कार्यान्वयन बूटस्ट्रैप क्लास लोडर का प्रतिनिधित्व करने के लिए शून्य का उपयोग कर सकते हैं। यदि यह वर्ग बूटस्ट्रैप क्लास लोडर द्वारा लोड किया गया था तो यह विधि इस तरह के कार्यान्वयन में शून्य हो जाएगी।

तो, कि कम से कम बताता है कि क्यों आप उस परिणाम मिलता है। लेकिन यह स्पष्ट नहीं करता है कि क्यों कार्यान्वयन करने वालों ने ऐसा करने का फैसला किया।

संपादित करें: बूटक्लासपैथ में अपनी कक्षाएं जोड़ने का परीक्षण करने के बाद वे नल क्लास लोडर के रूप में भी दिखाई देते हैं।

+0

धन्यवाद, मैं आपके प्रश्नों को संपादित करने की प्रक्रिया में था जब आपने मेरे पास अधिक सामान्य प्रश्नों को स्पष्ट करने का उत्तर दिया था। लेकिन किसी भी मामले में, आपका जवाब सहायक था। – jayunit100

+0

@ jayunit100 क्षमा करें ;-) लेकिन आप हमेशा अधिक प्रश्न पोस्ट कर सकते हैं। –

+2

यह पुरानी कार्यक्षमता है। मुझे लगता है कि यह इस तरह है क्योंकि "गलतियां की गईं"। इसके लिए एक संभावित कारण यह हो सकता है कि शून्य को लौटकर, कक्षा को कक्षा लोडर को स्टोर करने और/या ट्रैक करने की आवश्यकता नहीं है; यह getClassLoader को '{return null}' – DwB

2

बूटस्ट्रैप कक्षाओं का क्लासलोडर शून्य है, यह जावा श्रेणी नहीं है।

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

क्लासपाथ पर कक्षाएं सिस्टम क्लासलोडर द्वारा लोड की जाती हैं, और इसकी कक्षा को संपत्ति के माध्यम से निर्दिष्ट किया जा सकता है।

मोरेलसो नल क्लासलोडर को सुरक्षा समस्या माना जाता है और कॉलर क्लास के नल क्लासलोडर के आधार पर चेक होते हैं।

0

इस तरह यह काम करता है। जब भी JVM किसी भी वर्ग को लोड करने का प्रयास करता है तो यह नीचे स्थितियों की जांच करता है।

यदि कक्षा बूटस्ट्रैप क्लासपाथ से लोड की जाती है i.e; jdk \ jre \ lib \ rt.jar, बूटस्ट्रैप क्लासलोडर को बुलाया जाएगा।

यदि कक्षा विस्तार कक्षा से लोड की जाती है i.e; jdk \ jre \ lib \ ext * .jar, एक्सटेंशन क्लासलोडर कहा जाएगा।

यदि क्लास को एप्लिकेशन क्लासपाथ से लोड किया गया है i.e; जैसा कि पर्यावरण परिवर्तनीय में निर्दिष्ट है, अनुप्रयोग क्लासलोडर कहा जाता है।

चूंकि बूटस्ट्रैप क्लासलोडर जावा में लागू नहीं किया गया है, इसलिए इसे या तो सी या सी ++ में कार्यान्वित किया गया है, इसलिए इसका कोई संदर्भ नहीं है, यही कारण है कि यह शून्य हो जाता है। लेकिन जावा और एक्सटेंशन क्लास लोडर जावा में लिखा गया है, इसलिए आपको सूर्य के रूप में संदर्भ मिलेगा। [email protected] और [email protected]

तो, यदि आप इस System.out.println (String.class.getClassLoader()) की तरह कुछ करते हैं तो आप बूटस्ट्रैप क्लासलोडर द्वारा इस कक्षा को बुलाए जाने के बाद से शून्य हो जाएंगे, दूसरी तरफ यदि आप एक ही काम करते हैं एक्स्ट या ऐप क्लास पथ में एक कक्षा के लिए आपको क्रमशः $ ExtClassLoader @ someHexValue और [email protected] मिलेगा।

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