2012-10-27 7 views
6

हाल ही में मैं रनटाइम पर अपने एप्लिकेशन में गतिशील रूप से जार फ़ाइलों को लोड करने के तरीकों की तलाश कर रहा हूं।रनटाइम पर क्लासपाथ में फ़ाइलों को जोड़ने के लिए प्रतिबिंब का उपयोग करने के खतरे

मैं कई बार एक निश्चित समाधान के साथ आया हूं, जो मूल रूप से एक "हैक" है जो सिस्टम क्लासलोडर प्राप्त करता है और रनटाइम पर मूल क्लासपाथ में अतिरिक्त फ़ाइलों को जोड़ने के लिए अन्य विज़िप्स रोटक्टेड योजक विधि तक पहुंचने के लिए प्रतिबिंब का उपयोग करता है। यह समाधान वास्तव में अच्छी तरह से काम करता है और एक स्व-निर्मित कस्टम क्लास लोडर लिखते समय और उपयोग करते समय होने वाली समस्याओं से बचाता है।

URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
Class sysclass = URLClassLoader.class; 

try { 
     Method method = sysclass.getDeclaredMethod("addURL", parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader, new Object[] { u }); 
} catch (Throwable t) { 
     t.printStackTrace(); 
     throw new IOException("Error, could not add URL to system classloader"); 
} 

मेरा प्रश्न इस प्रकार है:: मुझे लगता है वहाँ addURL विधि पहली जगह में संरक्षित करने के लिए एक बहुत अच्छा कारण है, वहाँ नुकसान किसी तरह का हो या चाहिए

यह कुछ इस तरह दिखता गतिशील रूप से कक्षापथ में फ़ाइलों को जोड़ते समय खतरे।

यह मानने के अलावा कि सिस्टम क्लासलोडर हमेशा एक URLClassLoader है, जो "हमेशा मामला होना चाहिए" (टीएम), इस "हैक" का उपयोग करते समय मैं किस तरह की परेशानी में भाग सकता हूं?

धन्यवाद

+4

क्यों आप के बजाय एक नई classloader उदाहरण बनाने की * प्रणाली * classloader बदलना चाहते हैं जो अतिरिक्त जार फ़ाइलों के बारे में जानता है? –

+0

मैं ईमानदार होने के लिए पूरी तरह से यकीन नहीं कर रहा हूँ। मैं सामान्य रूप से क्लासलोडर्स की अवधारणा के लिए बहुत नया हूं, इसलिए उनके बारे में अभी भी बहुत कुछ है कि मैं पूरी तरह समझ नहीं पा रहा हूं। मैंने स्टैक ओवरफ्लो पर कहीं और पढ़ा है कि कस्टम क्लासलोडर का उपयोग करके कुछ स्थितियों में समस्याएं पैदा हो सकती हैं, उदाहरण के लिए यदि मैं इसे लाइब्रेरी लोड करने के लिए उपयोग करता हूं जो प्रोग्राम स्टार्टअप पर डिफ़ॉल्ट क्लासपाथ के माध्यम से लोड हो चुका है। ऊपर "यह" हैक, भले ही यह बहुत बुरा है, भरोसेमंद/असंगतता समस्याओं में भाग लेने के जोखिम के बिना रनटाइम पर जार लोड करने का एकमात्र तरीका माना जाता था। – thousands

+1

क्या आप * पुस्तकालयों को लोड करने की कोशिश कर रहे हैं जो पहले से ही डिफ़ॉल्ट क्लासपाथ में हैं? यह हैक अलग क्लासलोडर के * डिज़ाइन * दृष्टिकोण का उपयोग करने से अधिक जोखिम भरा लगता है। –

उत्तर

1

प्राथमिक खतरा अपने तरीके अस्तित्व का एक रन टाइम जांच पर भरोसा है।

यदि भविष्य में विधि हस्ताक्षर बदलते हैं, तो आप रन टाइम तक इसके बारे में नहीं जान पाएंगे। यदि कोई वैकल्पिक विधि प्रदान नहीं की जाती है तो यह एक खराब स्थिति में भी जा सकती है।

इसके अलावा, विशाल के रूप में पहले से ही कहा गया है, डिजाइनरों एक कारण के लिए विधि protected बनाने के लिए चुन (अन्य तो पूर्वविवेक की कमी)

संबंधित मुद्दे

 संबंधित मुद्दे