6

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

मेरा एनोटेशन प्रोसेसर इस तरह दिखता है;

@SupportedSourceVersion(SourceVersion.RELEASE_6) 
@SupportedAnnotationTypes({ "com.kn.salog.annotation.AggregateField" }) 
public class SalogDTOAnnotationProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) { 
     //do some stuff 
    } 
} 

उत्तर

-2

आप अपने कार्यक्रम का निर्माण एक नियमित रूप से आवेदन के रूप में के रूप में पोर्टेबल नहीं होगा जिसका मतलब है कि इस बात के लिए javac संकलक, विस्तार करने के लिए किया है। किसी ने इसे कैसे प्राप्त किया है, इस बारे में अधिक जानकारी के लिए http://weblogs.java.net/blog/cayhorstmann/archive/2006/06/say_no_to_prope.html देखें।

+1

यह निश्चित रूप से एक समाधान है, लेकिन मुझे पूरा यकीन है कि यह एकमात्र समाधान नहीं है। मैं जो करना चाहता हूं वह कई मौजूदा ढांचे/टूलसेट्स, जैसे जैवसिस्ट द्वारा किया जा सकता है। मैं एक निर्भरता को पेश करने से बचने की कोशिश कर रहा था जो कि सख्ती से जरूरी नहीं दिखता है, हालांकि, जेडीके 1.6 में एनोटेशन प्रसंस्करण की शुरुआत जैवसिस्ट की कार्यक्षमता की तरह दिख रही थी। शायद मैं गलत था और मुझे अभी भी एक की आवश्यकता है संकलन समय बुनाई करने के लिए तीसरे पक्ष के उपकरण। – Steve

6

डिज़ाइन द्वारा, एनोटेशन प्रोसेसिंग सुविधा स्रोत कोड संसाधित होने के प्रत्यक्ष संशोधन की अनुमति नहीं देती है। हालांकि, कोई संसाधित किए जा रहे प्रकार के उप-वर्ग या सुपरक्लास उत्पन्न कर सकता है। कुछ योजनाओं के साथ, यह प्रश्न में प्रकार को संशोधित करने के कुछ प्रभावों की अनुमति देता है। मैंने एक उदाहरण लिखा है कि यह कैसे एक साथ फिट हो सकता है; अधिक विस्तृत स्पष्टीकरण और कुछ नमूना कोड के लिए this blog entry देखें।

6

आप "इंस्ट्रुमेंटेशन" की तलाश में हैं, जो AspectJ की तरह ढांचे हैं। इस मामले में आपको "-agent" विकल्प के साथ कमांड लाइन में एक जार निर्दिष्ट करना होगा, और फिर सभी लोड किए गए वर्गों को फ़िल्टर करने की संभावना है। इस फ़िल्टर चरण के दौरान आप एनोटेशन की जांच कर सकते हैं, और वर्चुअल मशीन में लोड होने से पहले बाइटकोड को संशोधित कर सकते हैं। वास्तविक बाइटकोड संशोधन करने के लिए पुस्तकालयों में "एएसएम", और शायद हाईलेवल रैपर "cglib" और "javassist" शामिल हैं। शुरुआती शुरुआत में फ़िल्टरिंग करने के लिए, आप कक्षाओं की एक सूची उत्पन्न करने के लिए अपने वर्गों को भी प्रीकंपाइल कर सकते हैं, जिसे आपके द्वारा नियंत्रित किया जाना चाहिए।

अधिक जानकारी के लिए java.lang.instrumentation देखें।

4

आप आंतरिक संकलक की कक्षाओं का उपयोग करना होगा - कुछ प्रेरणा:

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

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

+0

वे शानदार उदाहरण हैं। धन्यवाद! –

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