2009-12-17 18 views
32

मैं कुछ कोड है कि कॉल मिल गया है ..getClass()। GetClassLoader() शून्य है, क्यों?

x = getClass().getClassLoader(); 

यह हालांकि अशक्त देता है।

जब मैं एक ही कोड शुरू करता हूं जो ग्रहण से नहीं है, लेकिन कमांड लाइन, यह एक क्लासलोडर देता है।

मैं यह करने के कोड हैक कर सकते हैं ...

if (getClass().getClassLoader() == null) 
{ 
x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream(loadedPropFileName); 
} 

दोनों संकलित और एक ही JVM के साथ चलाए जा रहे हैं। (मैं 99.99% निश्चित हूँ)।

किसी के पास कोई विचार है कि पहले क्लासलोडर के लिए शून्य क्यों वापस आ जाएगा?

संपादित करें:

मेरा प्रश्न करता है "। किसी को भी किसी भी विचार क्यों एक ही कक्षा वापसी होगी अशक्त जब ग्रहण और एक वर्ग लोडर जब कमांड लाइन से भरी हुई के माध्यम से शुरू कर दिया है" है

सलाह के लिए धन्यवाद कि बूटस्टैप लोडर ग्रहण में कक्षा लोड कर रहा है। मुझे नहीं पता कि यह क्यों होता है।

उत्तर

30

हवाला देते हुए API doc:

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

+3

सच है, लेकिन यदि कार्यान्वयन समान है, तो कमांड लाइन और ग्रहण में अलग-अलग व्यवहार क्यों करें। मुझे लगता है कि ओपी वास्तव में पूछ रहा है ... –

+1

अगर वह जो कुछ मांग रहा है उससे अलग कुछ जानना चाहता है, तो वह क्यों नहीं पूछता कि वह वास्तव में क्या जानना चाहता है? – Bombe

3

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

मैं बिल्कुल ग्रहण क्या कर रहा है में जानकार नहीं हूँ, लेकिन मुझे लगता है कि यह बहुत संभव है कि आपके वर्ग नहीं जब ग्रहण से चलाया जा रहा बूटस्ट्रैप classloader लोड करता है है लेकिन यह उस तरह लग रहे बनाने के लिए ग्रहण प्रयास कर रहा है ।

बूटस्ट्रैप क्लासलोडर एक बार बूटस्ट्रैप होने के बाद स्थैतिक है और जब तक ग्रहण ने कार्यान्वयन को ओवरराइड नहीं किया है तब तक आप इसमें जार या कक्षाएं नहीं जोड़ सकते हैं ... इस मामले में, अभी तक एक और संभावित स्पष्टीकरण है।

0

मुझे एक ही समस्या थी। लेकिन का उपयोग कर इसे हल: -

<ClassName>.class.getClass().getResource(urlString); 

आशा इस दूसरों में मदद करता है ...

7

यह यह कैसे काम करता है। जब भी 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] क्रमशः प्राप्त होगा।

0

"यदि यह वर्ग बूटस्ट्रैप क्लास लोडर द्वारा लोड किया गया था तो यह विधि इस तरह के कार्यान्वयन में शून्य हो जाएगी।" - JavaDoc getClassLoader()

शून्य वर्ग लोडर सुरक्षा उद्देश्यों के लिए सिस्टम कक्षाओं के लिए आरक्षित है और केवल क्लास.forनाम (स्ट्रिंग नाम, बूलियन प्रारंभ, क्लासलोडर लोडर) का उपयोग किया जा सकता है। यदि किसी वर्ग में शून्य क्लासलोडर है, तो अधिकांश सुरक्षा जांच नहीं की जाती हैं।

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