2012-07-08 18 views
23

मैं सिर्फ गलत दिशा में देख रहा हूं लेकिन मुझे एनोटेशन प्रोसेसिंग पर जेएसई दस्तावेज बहुत मिलता है ... स्पैस। मैं एक एनोटेशन प्रोसेसर लिखना चाहता हूं जो एक गणना स्ट्रिंग अभिव्यक्ति के साथ उन्हें प्रतिस्थापित करने के लिए एनोटेटेड स्ट्रिंग फ़ील्ड और स्थानीय चर को संसाधित करता है। यह बहुत जटिल नहीं होना चाहिए, लेकिन मैं जावाडोक में javax.annotation.processing के लिए बहुत खो गया हूं।जावा एनोटेशन प्रोसेसर कैसे लिखें?

संपादित करें: मुझे संकलन समय पर एनोटेशन को संसाधित करने की आवश्यकता है क्योंकि मैं जेनरेट कोड को संशोधित करना चाहता हूं। यह एक गणना स्ट्रिंग अभिव्यक्ति के साथ एनोटेटेड निरंतर स्ट्रिंग एक्सप्रेशन को प्रतिस्थापित करना चाहिए।

+0

सहमत हुए, मेरा प्रवेश बिंदु यह ट्यूटोरियल था: http://tutorials.jenkov.com/java-reflection/annotations.html –

+2

क्या आप संकलन समय या रनटाइम पर एनोटेशन को संसाधित करना चाहते हैं? ध्यान दें कि एक मूर्ख जवाक सीमा के कारण स्थानीय चर पर एनोटेशन प्रभावी ढंग से बेकार हैं। –

+0

मैं संकलन समय पर उन्हें संसाधित करना चाहता हूं, इसलिए यह स्पष्ट रूप से केवल स्थिर स्ट्रिंग अभिव्यक्तियों के लिए काम करेगा। –

उत्तर

14

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

आप कैसे की जाँच https://github.com/pellaton/spring-configuration-validation-processor

+0

सैद्धांतिक रूप से, आप मूल .class फ़ाइल को संशोधित करने के लिए एनोटेशन प्रोसेसर + अपाचे बीसीईएल (या कुछ समान) का उपयोग कर सकते हैं। लेकिन यह गन्दा लगता है। – vanza

+0

एर ... क्या? मैं एनोटेशन फ्रेमवर्क का उपयोग करके संकलन से पहले स्रोत कोड को संशोधित नहीं कर सकता? –

+1

मैंने लिंक किए गए कोड को देखा। जाहिर है यह कोड उत्पन्न नहीं करता है, यह सिर्फ इसे मान्य करता है।मैं उम्मीद कर रहा था कि मैं वास्तविक कोड जनरेशन चरण से पहले सार सिंटेक्स ट्री को संशोधित कर सकता हूं। –

4

चेक

+0

मैंने जवासिस्ट और एएसएम को देखा है। शायद वे नौकरी करेंगे, लेकिन वे बाइट कोड मैनिपुलेशन के बारे में हैं। मैं एक उपकरण का उपयोग करना पसंद करूंगा जो मुझे सार सिंटेक्स ट्री में हेरफेर करने की अनुमति देगा। बाइट कोड मैनिपुलेशन केवल मेरा अंतिम उपाय होगा। –

+0

ठीक है, विकल्पों की जांच करने के बाद, ऐसा लगता है कि बाइट कोड मैनिपुलेशन एकमात्र व्यावहारिक विकल्प है। अगली चुनौती इसे मैवेन बिल्ड में एकीकृत करना है - न केवल मेरे लिए, बल्कि मेरी लाइब्रेरी के उपयोगकर्ताओं के लिए भी। –

+0

हम्म ... एएसटी में हेरफेर करना _my_ अंतिम उपाय होगा :) –

8

ऐसा करने वाले दो टूल Project Lombok और DuctileJ हैं। उस समय दोनों उपकरण मौजूद थे जब सवाल मूल रूप से पूछा गया था; अतिरिक्त उपकरण अब निश्चित रूप से मौजूद हैं।

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

आप अपनी आवश्यकताओं के अनुरूप इन उपकरणों में से किसी एक को अनुकूलित करने में सक्षम हो सकते हैं, या आप अपने कार्यान्वयन तकनीकों से प्रेरित अपने स्वयं के उपकरण को कार्यान्वित कर सकते हैं।

संकलन-समय प्रसंस्करण में कक्षा-फ़ाइल प्रसंस्करण पर दो फायदे हैं। एक यह है कि कंपाइलर आमतौर पर संकलित कोड से उपलब्ध होने की तुलना में अधिक जानकारी प्राप्त करता है। एक और यह है कि संकलन के बाद .class फ़ाइलों को फिर से लिखने के लिए डेवलपर को एक अलग उपकरण चलाने की आवश्यकता के बजाय संकलन के दौरान, एक चरण में सब कुछ होता है।

+0

निश्चित रूप से, और उल्लेखनीय है कि दोनों एएसटी को संशोधित करने के लिए हैक का उपयोग करते हैं, जावा में वर्तमान एनोटेशन प्रोसेसर में एक बग का शोषण करते हैं, आंतरिक जावैक एपीआई का उपयोग करते हैं जो हो सकता है कुछ भविष्य में तय/हटाया गया जेडीके (जो मेरे लिए एक बड़ा नुकसान के रूप में नीचे चला जाता है)। –

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