मान लिया जाये कि आप पहले से ही वर्ग संकलित, आप एक DatabaseClassLoader
है, जो एक डेटाबेस से वर्ग को लोड करता है बना सकते हैं।
public class DatabaseClassLoader extends ClassLoader {
public DatabaseClassLoader(ClassLoader parent, ... /* connection to database */) {
super(parent);
// store the connection
}
public Class findClass(String name) {
byte[] data = loadDataFromDatabase(name);
return defineClass(name, data, 0, data.length);
}
private byte[] loadDataFromDatabase(String name) {
// this is your job.
}
}
डेटाबेस केवल स्रोत कोड शामिल है, तो आपको पहले इसे संकलित करने के लिए होगा - कैसे किसी भी फाइल के बिना यह करने के लिए के लिए जावा एपीआई पर गौर।
ध्यान दें, इस प्रकार लोड किया गया वर्ग तब तक जीवित रहेगा जब तक कि क्लासलोडर जीवित रहता है, इसलिए आपको बदलाव के मामले में कक्षा को फिर से लोड करने में सक्षम होने के लिए एक नए वर्ग लोडर की आवश्यकता होगी।
इसके अलावा, यदि आप प्रतिबिंब के मुकाबले कक्षा के साथ अन्य तरीकों से बातचीत करना चाहते हैं, तो आप बेहतर कुछ इंटरफ़ेस (जो स्वयं अपने वर्ग पथ में हैं) को लागू करने दें, और एप्लिकेशन क्लास लोडर को अपने डेटाबेस के माता-पिता होने दें कक्षा लोडर।
आह, और लोड करने के लिए कैसे:
Class<?> c = Class.forName("util.abc.Test", myClassLoader);
या सीधे
Class<?> c = myClassLoader.loadClass("util.abc.Test");
यहाँ एक तरीका है जिसके अपने इंटरफेस की वस्तुओं बनाता है (किसी भी इंटरफेस की, वास्तव में) है:
public <X> X getImplementingObject(Class<X> interfaceClass, String className)
throws ClassNotFoundException, IllegalAccessException, InstantiationException
{
ClassLoader loader = new DatabaseClassLoader(interfaceClass.getClassLoader(), ...);
Class<?> cl = loader.loadClass(className);
Class<? extends X> c = cl.asSubclass(interfaceClass);
return c.newInstance();
}
(इसे सीएल की आवश्यकता है गधे को कोई तर्क नहीं है जो किसी भी अपवाद को फेंक नहीं देता है, बेशक (अगर ऐसा होता है, तो आपको यह अपवाद भी फेंक दिया जाएगा)।
यह इस तरह के प्रत्येक वर्ग के लिए एक नया क्लासलोडर बनाता है, इसलिए वे इंटरफ़ेस (या प्रतिबिंब) के माध्यम से केवल एक-दूसरे के साथ सहयोग कर सकते हैं।
ऑन-द-फ्लाई संकलन के लिए आपको जावा कंपाइलर एपीआई को देखना चाहिए, जैसा कि डीसीएन से उत्तर में उल्लिखित है। लेकिन मुझे लगता है कि पक्ष पर संकलन करना बेहतर होगा जो कक्षाओं को डेटाबेस में रखता है जो उन्हें खींचता है।
तो आप डेटाबेस में स्रोत (संकलित कक्षा नहीं) को स्टोर करना चाहते हैं, इसे फ्लाई पर संकलित करें, फिर इसे लोड करें? – justkt
@justkt हाँ, क्या मैं कर सकता हूं? धन्यवाद :) – Koerr