2008-12-04 10 views
6

मेरे पास एक पोस्ट-संकलन चरण है जो उत्पन्न कक्षाओं के जावा बाइटकोड में हेरफेर करता है। मैं लाइब्रेरी उपभोक्ताओं के लिए जितना संभव हो सके दर्द रहित बनाना चाहता हूं, इसलिए मैं इस प्रक्रिया को स्वचालित तरीके से (और यदि संभव हो) संकलक अज्ञेयवादी बना सकता हूं।जावा कंपाइलर्स में प्लगिंग

Annotation Processing API कई वांछित विशेषताओं (स्वचालित सेवा खोज; ग्रहण द्वारा समर्थित) प्रदान करता है। दुर्भाग्य से, इस कोड जनरेटर और doesn't support manipulation of existing artefacts के उद्देश्य से है:

उपकरण के लिए प्रारंभिक आदानों zeroth दौर द्वारा बनाई जा करने के लिए माना जाता है; इसलिए, को बनाने के लिए संबंधित स्रोतों में से किसी एक के लिए एक फाइलर एक्सेप्शन का परिणाम होगा।

एपीआई द्वारा अनुशंसित सजावटी पैटर्न एक विकल्प नहीं है।

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

को प्लग करने या लपेटने का कोई तरीका है जैसा कि javac द्वारा लगाया गया है? क्या किसी ने सफलतापूर्वक एनोटेशन प्रोसेसर को बाइटकोड में हेरफेर करने के लिए विचलित कर दिया है, इससे कोई फर्क नहीं पड़ता कि डॉक्टर क्या कहता है?

एनोटेशन संसाधन API कोड बदलने के लिए मतलब नहीं है:

उत्तर

4

ग्रूवी संकलक केवल बाईटकोड संकलक जो संकलन प्रक्रिया (Generate bytecode to support the Singleton pattern उदाहरण) में हुक करने की अनुमति देता है। जैसा कि आप पहले से ही पता चला है, आप बस एक क्लासलोडर स्थापित कर सकते हैं, रनटाइम पर बाइटकोड की जांच कर सकते हैं और इसे कुशल बना सकते हैं। यह braindead है लेकिन यह काम करता है। यह सामान्य का पालन करता है "हमें डर है कि एक डेवलपर कुछ बेवकूफ कोशिश कर सकता है" विषय जो आपको पूरे जावा में मिलेगा। जावैक का विस्तार करने का कोई तरीका नहीं है। प्रासंगिक वर्ग या तो निजी, अंतिम हैं या जावा के अगले संस्करण के साथ बदल जाएंगे।

एक और विकल्प एनोटेटेड जावा लिखना है, उदाहरण के लिए आप एक वर्ग "exampleTpl.java" लिखते हैं। फिर, आप एक प्रीकंपलर का उपयोग करते हैं जो "example.java" प्राप्त करने के लिए उस फ़ाइल में एनोटेशन का विस्तार करता है। शेष कोड में, आप Example का उपयोग करते हैं और ExampleTpl को अनदेखा करते हैं।

ग्रहण के लिए, bug report to automate this step है। मुझे इस क्षेत्र में किसी भी अन्य काम से अवगत नहीं है।

3

यह किया जा सकता है।

मेरे ब्लॉग पोस्ट Roman Numerals, in our Java पर एक नज़र डालें जहां एक एनोटेशन प्रोसेसर कोड को फिर से लिखने के लिए उपयोग किया जाता है। सीमा यह है कि यह केवल सूर्य के जाव के साथ काम करता है।

+0

आपका लिंक मर चुका है। –