2011-03-21 11 views
11

अब तक, कस्टम क्लासलोडर्स के लिए मैंने जो उदाहरण देखे हैं, वे URLClassLoader को उपclassing और संसाधनों में कक्षाओं को लोड करने के लिए उस विशिष्ट उदाहरण का उपयोग करना शामिल हैं।जार में कक्षाओं के लिए प्रतिस्थापन प्रणाली क्लासलोडर जार

मैंने SystemClassLoader को प्रतिस्थापित करने के वैकल्पिक तरीकों की तलाश करने के लिए व्यर्थ प्रयास किया है, ताकि क्लासपाथ में स्थित कक्षाओं के लिए मेरे क्लासलोडर से परामर्श लिया जा सके।

मैंने Thread.currentThread().setContextClassLoader की कोशिश की, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।

क्या यह भी संभव है?

+0

जब आप कहते हैं "ताकि क्लासपाथ में स्थित कक्षाओं के लिए मेरे क्लासलोडर से परामर्श किया जा सके", क्या आपका मतलब सामान्य प्रणाली वर्ग जैसे 'java.lang। *' आदि है या क्या आप अतिरिक्त तृतीय पक्ष कक्षाओं को लोड करने के लिए मतलब रखते हैं? – Pacerier

+0

तृतीय पक्ष वर्ग ... – Olaseni

उत्तर

8

भागो java.system.class.loader संपत्ति के साथ JVM:

java -Djava.system.class.loader=myClassLoader myApplication 
+3

मैं ऐसे समाधान की तलाश में हूं जो JVM कमांड लाइन – Olaseni

+0

को संशोधित करने से रोकता है, यदि आप सिस्टम क्लासलोडर को प्रतिस्थापित करना चाहते हैं तो ऐसा कोई समाधान नहीं है। आप कोड को अपने मालिकाना क्लासलोडर में बना सकते हैं और कक्षाओं को लोड करने के लिए इसका इस्तेमाल कर सकते हैं, लेकिन यह सिस्टम क्लासलोडर नहीं होगा। आम तौर पर मालिकाना क्लासलोडर बनाना ज्यादातर मामलों के लिए एक पर्याप्त समाधान है। – Tarlog

11

हालांकि इस एक पुराने सवाल है, वहाँ वास्तव में एक तरह से प्रणाली classloader को बदलने के लिए है। हालांकि, आप प्रतिबिंब के साथ, सौदा करने के लिए अधिक से अधिक प्राप्त कर सकते हैं।

 Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader 
     scl.setAccessible(true); // Set accessible 
     scl.set(null, new YourClassLoader()); // Update it to your class loader 

यह ओरेकल जेवीएम पर काम करना चाहिए।

+2

यह निश्चित रूप से एक निजी चर के आधार पर एक हैक है जो जावा के संस्करणों के बीच बदल सकता है, लेकिन यह मुझे एक तृतीय पक्ष निर्भरता में एक-जार और कोड के साथ समस्याओं के आसपास काम करने की अनुमति देता है जो System.getClassLoader() को कक्षा लोड करने के लिए कॉल करता है । चाल के लिए एक-जार के वर्ग लोडर को धक्का देना। – Gus

+0

@Xyene मेरे काम के साथ खत्म होने के बाद - यदि मैं क्लासलोडर को वापस URLClassLoader.getSystemClassLoader() पर डालता हूं तो एप्लिकेशन व्यवहार ठीक रहेगा? – ha9u63ar

+0

@ ha9u63ar मुझे लगता है कि यह आपके उपयोग के मामले पर निर्भर करता है; यदि आप सावधान नहीं हैं, तो यह संभावना है कि आपके वर्गों में दृश्यता समस्याएं होंगी (उदा। सिस्टम क्लासलोडर से लोड की गई कक्षा ए आपके द्वारा कक्षा बी को देखने में सक्षम नहीं होगी)। ऐसा कुछ सालों से हुआ है जब से मैंने ऐसा कुछ किया है, लेकिन सिस्टम लोडर को वापस रखने का कोई फायदा नहीं हो सकता है। – Xyene