2009-04-10 6 views
27

मैं प्रतिबिंब के साथ खेल रहा हूं और मैंने सोचा कि मैं कुछ ऐसा कर दूंगा जो कक्षा को लोड करता है और कक्षा में सभी क्षेत्रों के नाम प्रिंट करता है। मैं निरीक्षण करने के लिए कुछ है करने के लिए वर्ग का एक छोटा सा हैलो दुनिया प्रकार बनाया है: उपरोक्त के आधार पर* .class फ़ाइल लोड करने के लिए URLClassLoader का उपयोग कैसे करें?

[email protected]:~/eclipsews/SmallExample/bin$ ls 
IndependentClass.class 
[email protected]:~/eclipsews/SmallExample/bin$ java IndependentClass 
Hello! Goodbye! 
[email protected]:~/eclipsews/SmallExample/bin$ pwd 
/home/kent/eclipsews/SmallExample/bin 
[email protected]:~/eclipsews/SmallExample/bin$ 

मैं दो निष्कर्ष आकर्षित:

  • यह मौजूद है पर/घर/केंट/eclipsews/SmallExample/bin/IndependentClass.class
  • यह काम करता है! (लाइन जिसकी वजह से एक अपवाद चिह्नित है)

    import java.lang.reflect.Field; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.net.URLClassLoader; 
    
    public class InspectClass { 
        @SuppressWarnings("unchecked") 
        public static void main(String[] args) throws ClassNotFoundException, MalformedURLException { 
         URL classUrl; 
         classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class"); 
         URL[] classUrls = { classUrl }; 
         URLClassLoader ucl = new URLClassLoader(classUrls); 
         Class c = ucl.loadClass("IndependentClass"); // LINE 14 
         for(Field f: c.getDeclaredFields()) { 
          System.out.println("Field name" + f.getName()); 
         } 
        } 
    } 
    
    :

तो कोड प्रतिबिंब का उपयोग करना है जो (तो यह एक उचित .class फ़ाइल जो एक वर्ग लोडर से लोड किया जा सकता होना चाहिए)

लेकिन जब मैं इसे चलाने मैं:

Exception in thread "main" java.lang.ClassNotFoundException: IndependentClass 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at InspectClass.main(InspectClass.java:14) 

मेरे सवालों का:

  1. मैं गलत क्या कर रहा हूँ ऊपर? मैं इसे कैसे ठीक करूं?
  2. क्या कई वर्ग फ़ाइलों को लोड करने और उन पर फिर से चलाने का कोई तरीका है?
+0

क्या आप को दबा रहे हैं चेतावनी? –

+1

एक सामान्य गलती यूआरएल के रूप में वर्तमान निर्देशिका का उपयोग करना है, लेकिन अपनी सामान्य कक्षाओं के लिए वर्तमान निर्देशिका का भी उपयोग करना है। चूंकि डिफ़ॉल्ट अभिभावक सिस्टम क्लास लोडर है, इसलिए आपके क्लास लोडर को कक्षा लोड करने का मौका नहीं मिलता है। –

+0

फ़ाइल: ///home/kent/eclipsews/SmallExample/bins/IndependentClass.class यह होना चाहिए: फ़ाइल: ///home/kent/eclipsews/SmallExample/bin/IndependentClass.class? – dfa

उत्तर

34

चाहते Javadocs for the URLClassLoader(URL[]) constructor से लोड कर सकते हैं :

डिफ़ॉल्ट प्रतिनिधिमंडल पैरेंट क्लाउडलोडर का उपयोग कर निर्दिष्ट URL के लिए एक नया URLClassLoader बनाता है। पहली बार अभिभावक वर्ग लोडर में खोज के बाद कक्षाओं और संसाधनों के लिए निर्दिष्ट क्रम में यूआरएल की खोज की जाएगी। कोई भी URL जो '/' के साथ समाप्त होता है उसे निर्देशिका के संदर्भ में माना जाता है। अन्यथा, यूआरएल को एक जेएआर फ़ाइल का संदर्भ माना जाता है जिसे आवश्यकतानुसार डाउनलोड और खोला जाएगा।

  1. निर्देशिका कि .class फ़ाइल में
  2. एक जार में .class फ़ाइल रखो और कि
का उल्लेख है का संदर्भ लें:

तो आपके पास दो विकल्प

(1) इस मामले में आसान है, लेकिन (2) यदि आप नेटवर्क संसाधनों का उपयोग कर रहे हैं तो आसान हो सकता है।

+0

+1 धन्यवाद! ये वे चीजें हैं जिनके बारे में कभी नहीं सोचा जाता है। – Daniel

9

आप निर्देशिका या URLClassLoader करने के लिए अपने .class फ़ाइलों से युक्त जार फ़ाइलों प्रदान करनी चाहिए:

classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/"); 

और हाँ, आप के रूप में कई वर्गों के रूप में आप

1

मुझे एक जैसी समस्या थी लेकिन मेरी कक्षा फ़ाइल "customElements" नामक पैकेज के अंदर रह रही थी। ऐसे परिदृश्यों में यूआरएल को रूट पैकेज के ऊपर फ़ोल्डर तक और लोड विधि में पैकेज तक समेत कक्षा का पूरा नाम पारित किया जाना चाहिए।उदाहरण के लिए, मेरे मामले में; यूआरएल की तरह था:

File customElementsDir = new File("D:/My Space"); 
//File customElementsDir = new File("D:\\customElements"); 
URL[] urls = null; 
try { 
    URL url = customElementsDir.toURI().toURL(); 
    urls = new URL[] { url }; 
} catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

और वास्तविक लोड हो रहा है की तरह था:

clazz = childFirstClassLoader 
      .loadClass("customElements.CustomLoadableClass"); 

कहाँ childFirstClassLoader मेरी classloader है।

6

आप पूरी तरह से योग्य वर्ग के नाम के रूप में अपनी पैकेज पथ के साथ साथ यह है कि वर्ग के नाम देकर वर्ग लोड करने के लिए है,

Class c = ucl.loadClass("com.mypackage.IndependentClass"); 
संबंधित मुद्दे

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