2012-07-25 17 views
6

मेरे पास कक्षा लोडर से संबंधित कई प्रश्न हैं।किस वर्ग लोडर का उपयोग किया जाता है?

Class.forName("class.name"); 

और

.... 
NotYetLoadedClass cls = new NotYetLoadedClass(); 
..... 

किस क्लास लोडर प्रत्येक मामले में इस्तेमाल किया जाएगा? पहले मामले में मैं क्लास लोडर मानता हूं जिसका उपयोग उस वर्ग को लोड करने के लिए किया जाता था जिसमें विधि कोड निष्पादित होता है। और दूसरे मामले में मैं थ्रेड संदर्भ वर्ग लोडर मानता हूं।

यदि मैं गलत हूं, तो एक छोटी व्याख्या की सराहना की जाती है।

+5

पहले मामले के लिए http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 देखें (आपकी धारणा सही है)। एक अच्छा स्पष्टीकरण के लिए यह भी देखें [यह प्रश्न] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader)। – DNA

उत्तर

2

दोनों वर्तमान ClassLoader का उपयोग करते हैं। चूंकि डीएनए सही ढंग से इंगित करता है, http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 बताता है कि Class.forName() वर्तमान क्लास लोडर का उपयोग करता है। एक छोटी सी प्रयोग से पता चलता एक वर्ग new कथन का उपयोग इन्स्टेन्शियशन के लिए लोड भी वर्तमान ClassLoader का उपयोग करता है:

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
     Thread.currentThread().setContextClassLoader(new MyClassLoader()); 
     SomeClass someClass = new SomeClass(); 
     someClass.printClassLoader(); 
    } 

    public static class MyClassLoader extends ClassLoader 
    { 
     public MyClassLoader() 
     { 
      super(); 
     } 

     public MyClassLoader(ClassLoader parent) 
     { 
      super(parent); 
     } 
    } 
} 



public class SomeClass 
{ 
    public void printClassLoader() 
    { 
     System.out.println(this.getClass().getClassLoader()); 
     System.out.println(Thread.currentThread().getContextClassLoader()); 
    } 
} 

Test में हम कुछ कस्टम ClassLoader करने के लिए वर्तमान की धागा ContextClassLoader सेट और फिर वर्ग SomeClass की एक वस्तु का दृष्टांत। SomeClass में हम वर्तमान थ्रेड के कॉन्टेक्स्ट क्लासलोडर और ClassLoader प्रिंट करते हैं जो इस ऑब्जेक्ट की कक्षा को लोड करते हैं। परिणाम

[email protected] 
[email protected] 

यह दर्शाता है कि वर्तमान ClassLoader (sun.misc.Launcher.AppClassLoader) वर्ग लोड करने के लिए इस्तेमाल किया गया था है।

+0

"वर्तमान 'क्लासलोडर'" से आपका क्या मतलब है? – jameshfisher

+0

@jameshfisher "वर्तमान वर्ग का परिभाषित वर्ग लोडर" – Uli

+0

"वर्तमान वर्ग" से आपका क्या मतलब है? लेक्सिकल गुंजाइश? – jameshfisher

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