2010-12-21 14 views
5

ऐसा लगता है कि हर कोई, उस चीज़ आप META-INF/सेवाओं/com.example.Interface की तरह नाम की एक फ़ाइल के साथ कर सकते Java Service Provider साथ एक अप्रिय ब्रश पड़ा है, लेकिन है कि कोई भी सही XML पार्सर लोड करने की कोशिश के अलावा का उपयोग करता है । मैं एक लाइब्रेरी के साथ काम करने की कोशिश कर रहा हूं जो सेवा प्रदाता API का उपयोग करता है, और इसे चालित करता है ताकि मैं कुछ रनटाइम-विस्तारित कक्षाएं (cglib का उपयोग करके) प्रदान कर सकूं जो वास्तव में इंटरफ़ेस को लागू नहीं करता है लेकिन इसे आसानी से करने के लिए किया जा सकता है।जावा सेवा प्रदान करने वाले एपीआई को काम करने के लिए कैसे माना जाता है?

मूल रूप से, मुझे लगता है कि चरणों मैं प्रदर्शन करने की जरूरत है:

  1. एक कस्टम वर्ग लोडर कि getResources (...) का जवाब देंगे बनाएँ और वापसी एक "अतिरिक्त" यूआरएल
  2. इसके अलावा उस वर्ग लोडर हुक है जब अनुरोध getResourceAsStream (...) कक्षाओं मैं cglib, जब "अतिरिक्त" संसाधन
  3. अंत के लिए कहा साथ हेरफेर करने के लिए जा रहा हूँ की एक सूची वापस जाने के लिए, उस वर्ग लोडर उन वर्गों लोड है

लेकिन यहाँ है जहां मैं खो गया। उदाहरण के लिए, जब पुस्तकालय यह निर्धारित करने का प्रयास करता है कि वहां कौन से कार्यान्वयनकर्ता बाहर हैं, तो यह getResources (...) को कॉल करता है जो यूआरएल का एक गुच्छा देता है। लेकिन GetResourceAsStream (...) यूआरएल नहीं लेता है, इसमें "नाम" लगते हैं। नाम जो क्लासपाथ-रिश्तेदार प्रतीत होते हैं, और इसलिए हर जगह समान हैं। तो मेटा-आईएनएफ/सेवाएं/com.example.Interface में मेटा-आईएनएफ/सेवाओं/com.example के रूप में एक ही "नाम" है। उनके जेएआर में इंटरफेस, है ना? किसी भी तरह के अलावा यह उन विस्फोट एक्सएमएल पारसर्स साथ काम करता है ...

बेशक

, बल्कि, ClassLoader.getSystemResources (...) का उपयोग कर classloader से) ClassLoader.getSystemClassLoader (कॉल करने के लिए मान लिया गया है यह सब वे स्मार्ट थे/तरह पर्याप्त। getSystemResourceAsStream (...), आदि, जैसा कि बाद के मामले में क्लासलोडर को हुक करने और फ़ेक्ड फ़ाइल प्रदान करने का कोई तरीका नहीं है।

मैं उस मामले में लगता है कि मैं BCEL इस्तेमाल कर सकते हैं जब मेरे कोड बल्कि cglib साथ यह करने के लिए क्रम जब तक इंतज़ार कर की तुलना में, Maven द्वारा पैक किया जा रहा है वर्ग फ़ाइलों में हेरफेर करने के?

+0

आप कुछ स्टब्स संकलन किया जा सका और हमेशा की तरह META-INF/सेवाओं के माध्यम से उन्हें रजिस्टर, लेकिन फिर cglib साथ प्रॉक्सी उन्हें एक बार उनके लोड कर रहे हैं? – OrangeDog

+0

वास्तविक प्रश्न/समस्या क्या है? कस्टम क्लास लोडर का उपयोग करने का आपका दृष्टिकोण (और लाइब्रेरी को कॉल के आसपास संदर्भ क्लास लोडर के रूप में सेट करना जो स्रोतों को कॉल करता है ...) काम करना चाहिए। –

+0

bkail - परम समस्या यह है कि मैं वर्गों मिल गया है है ('Type1',' Type2', ...) है कि एक और वर्ग ('Runner') है, जो खुद को एक जीयूआई अंदर चलाते हैं द्वारा चलाए जा सकता है। विभिन्न कारणों से, यह मेरे आवेदन में बदसूरत है। मैं जो करना चाहता हूं वह गतिशील रूप से उन्हें "फ्यूज" करना है और जीयूआई को प्रस्तुत 'रनर $ टाइप 1', 'रनर $ टाइप 2' इत्यादि है, ताकि उपयोगकर्ता इस बात से अवगत हों कि कक्षाएं क्या उपलब्ध हैं। –

उत्तर

3

विचार मैं वर्णित सही ट्रैक के साथ किया गया था। मैंने जो गलती की थी, वह सोच रहा था कि यूआरएल की सामग्री तक पहुंचने के लिए ClassLoader.getResourceAsStream(..) का उपयोग करना। इसके बजाय, आपको केवल URL.openStream() होना चाहिए।

था मैं पोस्टिंग, java.util.ServiceLoader (1.6 @since) कैसे सही ढंग से काम करने के लिए में कुछ अंतर्दृष्टि प्रदान करता है इससे पहले कि यह मिल गया।

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

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