2011-06-02 11 views
33

जावा क्लास फ़ाइलों को गतिशील रूप से लोड करने का एक अच्छा तरीका क्या होगा ताकि एक जार में संकलित एक प्रोग्राम निर्देशिका में सभी वर्ग फ़ाइलों को पढ़ सके और उनका उपयोग कर सके, और फाइलें कैसे लिख सकती हैं ताकि जार के संबंध में उनके पास आवश्यक पैकेज नाम हो?जावा क्लास फ़ाइलों को गतिशील रूप से लोड करने का तरीका

उत्तर

70

मुझे विश्वास है कि यह ClassLoader है जिसके बाद आप हैं।

मेरा सुझाव है कि आप नीचे दिए गए उदाहरण को देखकर शुरू करें जो क्लास पथ पर नहीं है जो क्लास फाइलों को लोड करता है।

// Create a File object on the root of the directory containing the class file 
File file = new File("c:\\myclasses\\"); 

try { 
    // Convert File to a URL 
    URL url = file.toURL();   // file:/c:/myclasses/ 
    URL[] urls = new URL[]{url}; 

    // Create a new class loader with the directory 
    ClassLoader cl = new URLClassLoader(urls); 

    // Load in the class; MyClass.class should be located in 
    // the directory file:/c:/myclasses/com/mycompany 
    Class cls = cl.loadClass("com.mycompany.MyClass"); 
} catch (MalformedURLException e) { 
} catch (ClassNotFoundException e) { 
} 
+4

+1 URLClassLoader जाने का रास्ता है! – OscarRyz

+0

हां, मेरा मानना ​​है कि क्लासलोडर वह है जिसे मैं ढूंढ रहा हूं। हालांकि, क्या आप भारित वर्ग का प्रभावी ढंग से उपयोग करने के तरीके के बारे में सोच सकते हैं? मैं इसे एक इंटरफेस लागू कर सकता हूं ... लेकिन मैं उस इंटरफ़ेस को कैसे संदर्भित कर सकता हूं? हम्म ... शायद अगर मैं संकलित जार को बाहरी जार के रूप में जोड़ना चाहता हूं ... उस स्थिति में, मुझे लोड वर्ग के पैकेज को क्या कहना चाहिए? अगर मेरे पास है: /thing/myjar.jar और चीज़/loadedclasses/class.class, उस वर्ग के लिए घोषित पैकेज क्या होगा? – MirroredFate

+0

हां, आपको कुछ इंटरफ़ेस या अमूर्त वर्ग पर सहमत होना होगा जो लोड-टू-लोड कक्षाएं लागू/विस्तारित करती हैं। (या पूरी तरह से लोड कक्षाओं के प्रतिबिंब पर भरोसा करते हैं।) – aioobe

1

आपने अपनी कक्षा के पथ के लिए एक निर्देशिका जोड़ते हैं तो आप आवेदन प्रारंभ होने के बाद कक्षाओं में जोड़ सकते हैं और उन वर्गों जैसे ही वे निर्देशिका के लिए लिखा गया है लोड किया जा सकता।

7
MyClass obj = (MyClass) ClassLoader.getSystemClassLoader().loadClass("test.MyClass").newInstance(); 
obj.testmethod(); 

या

MyClass obj = (MyClass) Class.forName("test.MyClass").newInstance(); 
obj.testmethod();