हम प्लगइन का समर्थन करने के लिए हमारे जावा एप्लिकेशन को विस्तारित कर रहे हैं। इसमें से एक हिस्सा हमारे स्वयं के वर्गों से अलग प्लगइन रखने में शामिल है, इस प्रकार प्रत्येक प्लगइन अपने स्वयं के वर्ग लोडर में रहेंगे।फ़िल्टरिंग क्लास लोडर को लागू करना
हम प्लगइन को जावा फ्रेमवर्क को काम करने के लिए भी योजना बनाने की योजना बना रहे हैं, इस प्रकार इसे प्लगइन के संपर्क में आना होगा। इस जावा ढांचे में कक्षाएं भी शामिल हैं जिन्हें हमारे अपने जावा कोड से सुलभ होने की आवश्यकता होगी, इसलिए इसे अपने जावा कोड के लिए भी सुलभ होना होगा।
समस्या यह है कि यदि जावा फ्रेमवर्क सिस्टम क्लास लोडर (जहां हमारा अपना जावा कोड रहता है) में रहता है, तो हम प्लगइन को अलगाव नहीं दे सकते हैं। यदि हम जावा फ्रेमवर्क को एक अलग वर्ग लोडर से अलग करना चुनते हैं और प्लगइन क्लास लोडर के माता-पिता के रूप में इसका उपयोग करते हैं, तो जावा ढांचा हमारे स्वयं के वर्गों के लिए दृश्यमान नहीं होगा।
वर्तमान समाधान जो मुझे दिमाग में था, फ़िल्टरिंग क्लास लोडर को लागू करना था। जावा फ्रेमवर्क सिस्टम क्लास लोडर में लाइव होगा, लेकिन यह क्लास लोडर जावा फ्रेमवर्क को छोड़कर सिस्टम क्लास लोडर से सब कुछ फ़िल्टर करेगा और मैं इस क्लास लोडर को प्लगइन के पैरेंट क्लास लोडर के रूप में उपयोग करूंगा।
यहाँ यह का एक मोटा कार्यान्वयन है:
public class FilteringClassLoader extends ClassLoader {
private URLClassLoader _internalLoader;
public FilteringClassLoader(ClassLoader parent) {
super(parent);
// load our java framework to this class loader
_internalLoader = new URLClassLoader(...)
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
// first, try to load from our internal class loader
// that only sees the java framework if that works, load the class
// from the system class loader and return that. otherwise, the class
// should be filtered out and the call to loadClass will throw as expected
_internalLoader.loadClass(name);
Class<?> retClazz = super.loadClass(name);
return retClazz;
}
}
हालांकि इस कई समस्याएं जिस तरह से मैं इसे देखना है:
- एक अलग URLClassLoader का उपयोग वर्ग फिल्टर किया जाना चाहिए की तरह लगता है, तो केवल देखने के लिए मेरे लिए एक हैक।
- जब कोई प्लगइन कक्षा को लोड करता है, तो कक्षा क्लास क्लास लोडर सिस्टम क्लास लोडर होगा, जो कि मैं जो हासिल करने की कोशिश कर रहा हूं उसके पूरे उद्देश्य को स्पष्ट रूप से हरा देता है।
आप इस तरह की समस्या का समाधान कैसे करते हैं?
क्या यह जेआरई पुस्तकालय में 'com.sun' पैकेजों पर निर्भरताओं को पेश करने वाले लोगों से अलग है? या फिर और बाधाएं हैं? – McDowell
सुनिश्चित नहीं है कि आपका क्या मतलब है –