मैं प्रतिबिंब के साथ खेल रहा हूं और मैंने सोचा कि मैं कुछ ऐसा कर दूंगा जो कक्षा को लोड करता है और कक्षा में सभी क्षेत्रों के नाम प्रिंट करता है। मैं निरीक्षण करने के लिए कुछ है करने के लिए वर्ग का एक छोटा सा हैलो दुनिया प्रकार बनाया है: उपरोक्त के आधार पर* .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)
मेरे सवालों का:
- मैं गलत क्या कर रहा हूँ ऊपर? मैं इसे कैसे ठीक करूं?
- क्या कई वर्ग फ़ाइलों को लोड करने और उन पर फिर से चलाने का कोई तरीका है?
क्या आप को दबा रहे हैं चेतावनी? –
एक सामान्य गलती यूआरएल के रूप में वर्तमान निर्देशिका का उपयोग करना है, लेकिन अपनी सामान्य कक्षाओं के लिए वर्तमान निर्देशिका का भी उपयोग करना है। चूंकि डिफ़ॉल्ट अभिभावक सिस्टम क्लास लोडर है, इसलिए आपके क्लास लोडर को कक्षा लोड करने का मौका नहीं मिलता है। –
फ़ाइल: ///home/kent/eclipsews/SmallExample/bins/IndependentClass.class यह होना चाहिए: फ़ाइल: ///home/kent/eclipsews/SmallExample/bin/IndependentClass.class? – dfa