2010-10-26 18 views
8

क्या जावा में किसी भी वर्ग को लोड होने पर अपना कोड चलाने का कोई व्यवहार्य तरीका है, उपयोगकर्ता को कस्टम क्लासलोडर के साथ सभी वर्गों को स्पष्ट रूप से और मैन्युअल रूप से लोड करने के बिना मजबूर किए बिना?मैं कक्षा कोड पर अपना कोड कैसे चला सकता हूं?

विवरण में बहुत अधिक जाने के बिना, जब भी एक निश्चित इंटरफेस को लागू करने वाली कक्षा अपनी एनोटेशन पढ़ती है जो इसे किसी अन्य वर्ग से जोड़ती है, और जोड़ी को तीसरी कक्षा में देती है।

संपादित करें: हेक, मैं विवरण पर जाऊंगा: मैं एक ईवेंट हैंडलिंग लाइब्रेरी कर रहा हूं। मैं जो कर रहा हूं वह क्लाइंट कोड अपने स्वयं के श्रोता/ईवेंट जोड़े कर रहा है, जिसे मेरी लाइब्रेरी के साथ एक जोड़ी के रूप में पंजीकृत करने की आवश्यकता है। (एचएम, वह सब के बाद इतना लंबा नहीं था)।

आगे संपादित करें: वर्तमान में क्लाइंट कोड को कक्षाओं/इंटरफेस की जोड़ी मैन्युअल रूप से पंजीकृत करने की आवश्यकता है, जो बहुत अच्छी तरह से काम करता है। मेरा इरादा इसे स्वचालित करना है, और मैंने सोचा कि एनोटेशन के साथ दो वर्गों को जोड़ने से मदद मिलेगी। इसके बाद, मैं हमेशा पंजीकरण की सूची को अद्यतित रखने की आवश्यकता वाले क्लाइंट कोड से छुटकारा पाना चाहता हूं।

पीएस: स्थैतिक ब्लॉक नहीं करेगा, क्योंकि मेरा इंटरफ़ेस लाइब्रेरी में बंडल किया गया है, और क्लाइंट कोड आगे इंटरफेस बनाएगा। इस प्रकार, अमूर्त वर्ग या तो नहीं करेंगे, क्योंकि यह एक इंटरफ़ेस होना चाहिए।

+0

एचएम, क्या आपने स्थिर प्रारंभिक ब्लॉक का उपयोग करने का प्रयास किया था? – Kel

उत्तर

8

यदि आप किसी इंटरफ़ेस पर व्यवहार का आधार बनाना चाहते हैं, तो आप उस इंटरफ़ेस में एक स्थिर प्रारंभकर्ता का उपयोग कर सकते हैं।

public interface Foo{ 

    static{ 
     // do initializing here 
    } 

} 

मैं यह नहीं कह रहा हूं कि यह अच्छा अभ्यास है, लेकिन यह निश्चित रूप से कार्यान्वित कक्षाओं में से एक को पहली बार शुरू कर देगा।

अपडेट: इंटरफेस में स्थिर ब्लॉक अवैध हैं। इसके बजाय अमूर्त कक्षाओं का प्रयोग करें!

संदर्भ:

  • Initializers (सन जावा ट्यूटोरियल)

लेकिन अगर मैं तुम सही समझते हैं, आप प्रारंभ वर्ग को लागू करने के प्रति एक बार होता है करना चाहते हैं। यह मुश्किल होगा। आप निश्चित रूप से एक इंटरफ़ेस आधारित समाधान के साथ ऐसा नहीं कर सकते हैं। आप इसे एक अमूर्त बेस क्लास के साथ कर सकते हैं जिसमें एक गतिशील प्रारंभकर्ता (या कन्स्ट्रक्टर) है, जो जांचता है कि अनुरोधित मैपिंग पहले से मौजूद है या नहीं, और अगर यह नहीं करता है तो इसे जोड़ता है, लेकिन रचनाकारों में ऐसी चीजें करना काफी हैक है।

मैं कहूंगा कि आप सबसे अच्छे विकल्प या तो निर्माण समय पर कोड उत्पन्न करने के लिए या एटीटी के साथ बाइटकोड विश्लेषण के माध्यम से एनोट के साथ एनोटेशन प्रोसेसिंग के माध्यम से या कक्षा लोड समय पर एजेंट का उपयोग गतिशील रूप से मैपिंग बनाने के लिए करते हैं।


आह, अधिक इनपुट। बहुत अच्छा। इसलिए ग्राहक आपकी लाइब्रेरी का उपयोग करते हैं और एनोटेशन के आधार पर मैपिंग प्रदान करते हैं। तब मैं कहूंगा कि आपकी लाइब्रेरी को प्रारंभिक विधि प्रदान करनी चाहिए, जहां क्लाइंट कोड कक्षाएं पंजीकृत कर सकता है।कुछ इस तरह:

YourLibrary.getInstance().registerMappedClasses(
    CustomClass1.class, 
    CustomClass2.class, 
    CustomClass3.class, 
    CustomClass4.class 
) 

या, और भी बेहतर, एक पैकेज स्कैनिंग सिस्टम (उदाहरण के कोड इस लागू करने के लिए at this question पाया जा सकता है):

YourLibrary.getInstance().registerMappedClassesFromPackages(
    "com.mycompany.myclientcode.abc", 
    "com.mycompany.myclientcode.def" 
) 

वैसे भी, मूल रूप से कोई रास्ता नहीं होने से बचाने के है आपके ग्राहक उस तरह के काम करते हैं, क्योंकि आप उनके निर्माण प्रक्रिया को नियंत्रित नहीं कर सकते हैं और न ही उनके लिए उनके क्लासलोडर (लेकिन आप निश्चित रूप से क्लासलोडर या कॉन्फ़िगरेशन बनाने के लिए गाइड प्रदान कर सकते हैं)।

+0

(बस ओपी को और जानकारी दी गई) स्थैतिक ब्लॉक या अमूर्त वर्ग नहीं करेंगे। आप सही समझ गए - यह क्लाइंट-कोड इंटरफ़ेस प्रति किया जाएगा। –

+0

मैं वर्तमान में पंजीकरण कर रहा हूं (सिवाय इसके कि मेरे पास अभी तक कोई टिप्पणी नहीं है, और वे क्लाइंट-परिभाषित जोड़े में पंजीकृत हैं) जो अच्छी तरह से काम करता है। इसे स्वचालित करने के लिए सोचा। लेकिन वह पैकेज-स्कैनिंग विधि बहुत आकर्षक लगती है (रिफैक्टरिंग के अलावा कठिन)। मैं उस समाधान पर एक नज़र डालेगा। हां, यहां तक ​​कि यहां स्वीकार नहीं किया जा रहा है। –

+1

आराम करें, आपने अभी एक घंटे पहले सवाल पूछा था, अभी कुछ भी स्वीकार करने की आवश्यकता नहीं है। बीटीडब्ल्यू: यहां तक ​​कि यदि आप करते हैं, तो आप * बाद में एक उत्तर स्वीकार नहीं कर सकते हैं। –

2

यदि आप चाहते हैं कोड के कुछ टुकड़े किसी भी वर्ग लोड हो रहा है पर चलाने के लिए, आप चाहिए:

  1. classloader के ऊपर लिख, loadClass तरीकों पर अपने स्वयं के कस्टम कोड जोड़ने (अग्रेषण माता-पिता के लिए मत भूलना क्लासलोडर आपके कस्टम कोड के बाद या उससे पहले)।
  2. इस कस्टम क्लासलोडर को अपने सिस्टम के लिए डिफ़ॉल्ट के रूप में परिभाषित करें (यहां आपको यह कैसे करना है: How to set my custom class loader to be the default?)।
  3. इसे चलाएं और जांचें।

पर्यावरण की किस तरह आप कर रहे हैं पर निर्भर करता है, वहाँ संभावना है कि सभी नहीं कक्षाएं अपने कस्टम classloader trouugh लोड किया जा रहे हैं (कुछ उपयोगिता संकुल का उपयोग अपने स्वयं के सीएल, कुछ जावा ईई कंटेनर विशिष्ट classLoaders के साथ कुछ spacific क्षेत्रों को संभालने, इत्यादि), लेकिन यह आप जो पूछ रहे हैं उसके लिए यह एक तरह का अपरिवर्तनीय है।

+0

धन्यवाद। मैं इसे एक शॉट दूंगा। हालांकि, मैं अभी तक इस जवाब को स्वीकार नहीं करूंगा। –

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

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