2011-09-04 14 views
6

हमारे पास जावा कोड की एक लाइब्रेरी है जिसे हम परियोजनाओं में उपयोग करना चाहते हैं। इन परियोजनाओं में से कुछ को इस पुस्तकालय में जावा ऑब्जेक्ट्स में एनोटेशन जोड़ने की आवश्यकता होगी (यानी एक प्रोजेक्ट में, इन ऑब्जेक्ट्स का उपयोग जेएक्स-आरएस सर्वलेट कार्यान्वयन में किया जाएगा ताकि उन्हें जेएक्सबी, जेएसओएन आदि एनोटेशन के साथ एनोटेट किया जाना चाहिए)। मेरे पास जो मुद्दा है वह यह है कि मैं मूल पुस्तकालय को बदले बिना इन एनोटेशन को कैसे जोड़ सकता हूं, यह नहीं समझ सका।जावा प्रोजेक्ट में एनोटेशन जोड़ना/संशोधित करना

इस उदाहरण पर विचार:

public class MyClass 
{ 
    private String field1; 
    private int field2; 
} 

कुछ परियोजनाओं में, मैं वर्ग व्यवहार करने के लिए चाहते हैं जैसे कि वह

public class MyClass 
{ 
    @Annotation1 
    private String field1; 
    @Annotation2 
    private int field2; 
} 

था शुरू में मैं इंटरफेस या व्युत्पन्न वर्ग है कि अलग से एनोटेट का उपयोग कर के बारे में सोचा लेकिन यह नहीं पता कि यह कैसे करना है (या यह संभव है या नहीं)। मैंने जवासिस्ट सुझाव in this thread (यानी जावा बाइटकोड मैनिपुलेशन दृष्टिकोण) के बारे में भी पाया लेकिन मुद्दा यह है कि इसे एंड्रॉइड क्लाइंट्स पर भी काम करने की ज़रूरत है, इसलिए यह मेरे लिए एक विकल्प नहीं है। इस बिंदु पर मैं विचारों से बाहर हूं।

अगर कोई किसी भी तरह से मदद कर सकता है तो मैं सराहना करता हूं। शायद मुझे कुछ याद आ रहा है, या शायद मैं जो करने की कोशिश कर रहा हूं वह सही तरीका नहीं है। किसी भी मामले में, आगे बढ़ने के लिए मुझे अब कुछ मार्गदर्शन की आवश्यकता है।

अग्रिम धन्यवाद।

+0

मूल पुस्तकालय को बदलने के साथ समस्या क्या है? यह आपका कोड है, जैसा कि मैं बता सकता हूं। – CommonsWare

+0

लाइब्रेरी ऑब्जेक्ट्स, उनके संग्रह और इन-मेमोरी सीआरयूडी कार्यक्षमता (बाधाओं, सत्यापन आदि) का एक गुच्छा प्रबंधित करती है। इसमें इन वस्तुओं की धारावाहिकता और दृढ़ता का कोई ज्ञान नहीं है, और मैं उन्हें अलग रखना चाहता हूं।साथ ही, अनुपलब्ध एनोटेशन लक्ष्य प्लेटफॉर्म पर समस्याएं पैदा कर सकते हैं: एंड्रॉइड में जेएक्सबी एनोटेशन नहीं है और कोई भी फ्रेमवर्क जो एंड्रॉइड पर एनोटेशन को संसाधित करता है, भले ही जेएक्सबी एनोटेशन का उपयोग नहीं किया जा रहा हो (NoClassDefFoundError)। यदि वे लक्ष्य प्लेटफॉर्म द्वारा उपयोग नहीं किए जा रहे हैं तो मैं एनोटेशन जोड़ने से बचना चाहता हूं। – alokoko

उत्तर

4

मैं इस अधिक में देखा है और सारांश के रूप में, यहाँ मैं क्या पाया है:

  • जावा भाषा रनटाइम के दौरान एनोटेशन को बदलने की अनुमति नहीं है।
  • जावा बाइटकोड को संशोधित करने के लिए Javassist का उपयोग कर सकते हैं लेकिन यह एंड्रॉइड जैसे प्लेटफॉर्म पर काम नहीं करता है।
  • कोई ASM का उपयोग कर सकता है लेकिन इसमें जावा असेंबली से निपटना शामिल है (उदाहरण उदाहरण है: http://community.jboss.org/thread/150002)।

मुख्य रूप से जेएक्सबी एंड्रॉइड (और अन्य कारणों) पर मौजूद नहीं होने के कारण हमने JSON पर स्विच किया और जैक्सन को कार्यान्वयन के रूप में उपयोग करना शुरू किया। इस परिवर्तन का एक लाभ जैक्सन को "मिश्रित एनोटेशन" कहने का उपयोग करने की क्षमता थी जो कि मैं वही था जो मैं ढूंढ रहा था।

यहाँ लिंक है कि बताते है इसे और अधिक: http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0

रनटाइम के दौरान .class बाइटकोड हैकिंग का छोटा, यह नहीं किया जा सकता है। यदि आप वास्तव में रनटाइम के दौरान लाइब्रेरी कक्षाओं के बाइटकोड को गतिशील रूप से बदलना चाहते हैं तो आप जावासिस्ट का उपयोग कर सकते हैं लेकिन बड़ी तस्वीर में यह शायद बुरी तरह उड़ाएगा।

मैं सुझाव दूंगा कि आप लाइब्रेरी को एनोटेट करें और अगर आपका कोडबेस रीकंपाइल हो। यदि ऐसा नहीं है, तो भी आप लाइब्रेरी कक्षाओं/इंटरफेस को अपनी कक्षाओं/इंटरफेस में विरासत के माध्यम से लपेट सकते हैं और वहां एनोटेट कर सकते हैं। किसी भी तरह से, मुझे लगता है कि रनटाइम बाइटकोड हैकिंग के माध्यम से कोड में एनोटेट करना बेहतर होगा। जोड़ा गया बोनस, स्रोत में टिप्पणियां आईडीई द्वारा देखी जाएंगी, जिससे आईडीई आपको बेहतर सहायता कर सके।

+0

प्रश्न पर मेरी टिप्पणी देखें। मुझे पहले से ही जावासिस्ट के बारे में पता है, लेकिन मुझे एंड्रॉइड प्लेटफ़ॉर्म पर भी काम करने की ज़रूरत है और जैवसिस्ट एंड्रॉइड पर काम नहीं करता है। – alokoko

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