7

उपयोग उदाहरण:
मैं कक्षा फ़ील्ड को एक कस्टम एनोटेशन @ माईकॉन्टेनर रखना चाहता हूं और फिर प्रासंगिक सभी हाइबरनेट एनोटेशन (फ़ील्ड प्रकार और गुणों के आधार पर) पर स्वचालित रूप से जोड़ना चाहता हूं।
अतिरिक्त में मुझे कक्षा में JAXB XmlType एनोटेशन जोड़ने और कक्षा के नाम पर टाइप नाम का आधार जोड़ने की आवश्यकता है।
मैं अतिरिक्त प्रकार के आधार पर फ़ील्ड में एनोटेशन जोड़ने के लिए अतिरिक्त चाहता हूं, आदि सभी अतिरिक्त एनोटेशन रन टाइम पर उपलब्ध होना चाहिए (इसलिए हाइबरनेट/जेएक्सबी उन्हें ढूंढ सकता है)।जावा क्लास में प्रोग्रामेटिक एनोटेशन जोड़ना

  1. पूर्व प्रसंस्करण वर्ग स्रोत (बुरा विकल्प)
  2. प्रसंस्करण संकलन के दौरान javax.annotation.processing API के साथ
  3. पोस्ट संकलन में गड़बड़ी जैसे कि जावा उपकरणों के साथ:
    मैं निम्नलिखित विकल्पों के बारे में पता कर रहा हूँ java.lang.instrument एपीआई
  4. AspectJ (पर्याप्त शक्तिशाली नहीं)
साथ यह कर के साथ वर्ग लोड करने के दौरान सहायता
  • हेरफेर

    मेरे प्राथमिक लक्ष्य हैं:

    1. डिबगिंग
    2. समर्थन दोनों Maven और आईडीई (ग्रहण/Intellij) से काम करने के लिए वर्ग और स्रोत के बीच सिंक रखें

    मैं लोगों को अगर सराहना करेंगे जो पहले से ही ऐसी चीजें ऐसी कार्य (और शायद संभावित नुकसान) के लिए सर्वोत्तम दृष्टिकोण की सिफारिश कर सकती हैं।

  • +0

    एनोटेशन उत्पन्न करने के बारे में क्या नहीं, बल्कि इसके बजाय हाइबरनेट मैपिंग एक्सएमएल फाइलें (एचबीएम.एक्सएमएल) उत्पन्न करना जो हाइबरनेट कॉन्फ़िगरेशन द्वारा लोड किया जा सकता है? – Strelok

    +0

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

    उत्तर

    0

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

    संपादित करें: त्वरित खोज कार्यक्रम संबंधी जावा स्रोत संशोधन using the eclipse jdt या some thing in netbeans बारे में कुछ infos सामने आए। लेकिन यह कुछ और शोध या अपने आप के सवाल के लायक हो सकता है।

    +0

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

    +0

    यदि आप डरते हैं कि इससे अशुद्ध कोड हो सकता है, तो आपको अपनी वर्तमान कक्षा के इंटरफ़ेस का उपयोग करने पर विचार करना चाहिए और यथासंभव एनोटेशन के साथ कार्यान्वयन को छिपाना चाहिए। – SpaceTrucker

    0

    मैं उस पर एक और दृष्टिकोण सुझा देना चाहता हूं। चूंकि मेरे first answer में एक उपकरण को कोडिंग करना शामिल हो सकता है, तो आप एक बहुत ही सरल समाधान का प्रयास कर सकते हैं। जैसा कि मुझे आशा है कि आप अपनी कक्षाओं का परीक्षण कर रहे हैं, आप इस तरह के वर्ग के प्रत्येक यूनिट परीक्षण के लिए बेस क्लास लागू कर सकते हैं। इस बेस क्लास में एक टेस्ट विधि है, जो जांचता है कि @MyContainer के साथ एनोटेटेड प्रत्येक फ़ील्ड में आवश्यक हाइबरनेट एनोटेशन भी हैं।

    हमने मूल रूप से वही काम किया, न कि टिप्पणियों के लिए बल्कि खेतों की क्रमिकता के लिए और उस दृष्टिकोण के साथ काफी अच्छा प्रदर्शन किया।

    0

    आईडीई, कमांड लाइन बिल्ड और रन-टाइम पर विकल्प पार करने के लिए, विकल्प 1 (एपीटी का उपयोग करके) और विकल्प 5 (AspectJ का उपयोग करके) आपको सबसे अच्छा फिट देगा।

    विकल्प 1 के लिए आपको अपना खुद का एनोटेशन प्रोसेसर लागू करना होगा जो आपके अपने @MyContainer एनोटेशन की उपस्थिति के आधार पर अतिरिक्त एनोटेशन इंजेक्ट करेगा।something similar के लिए उपयोग किए जाने वाले इस दृष्टिकोण का एक उदाहरण यहां दिया गया है।

    विकल्प 5 के लिए आप बस annotation declaration का उपयोग कर सकते हैं। कुछ इस तरह:

    declare @field : * ((@*..MyContainer *)).*(..) : @OtherAnnotation(); 
    

    वसंत के रू उपकरण बड़े पैमाने पर विकल्प 5 उपयोग कर रहा है और मैं निश्चित रूप से यह नहीं कह सकते कि यह पर्याप्त शक्तिशाली नहीं है।

    +0

    क्या आप वर्ग/विधि/सदस्य की जानकारी पर एनोटेशन और एनोटेशन पैरामीटर का आधार बना सकते हैं? उदाहरण के लिए मुझे कंटेनर डेटा प्रकार की जांच करने और कुछ संभावित हाइबरनेट एनोटेशन के बीच चयन करने की आवश्यकता है। अतिरिक्त में मुझे फ़ील्ड नामों आदि के आधार पर हाइबरनेट एनोटेशन के लिए कॉलम नाम जेनरेट करने की आवश्यकता है ... –

    0

    उपरोक्त वर्णित कुछ विकल्प हैं और प्रत्येक में इसके ऊपर और डाउनसाइड्स हैं। यही कारण है कि मुझे उपरोक्त प्रश्न के लिए वास्तविक "सही" उत्तर नहीं लगता है। मेरा उद्देश्य समुदाय से और उन लोगों से इनपुट प्राप्त करना था जिन्होंने अतीत में ऐसी चीजें की थीं और अनुभव किया था। व्यक्तिगत रूप से मैंने Javassist के साथ Instrument API का उपयोग करना चुना है। इस तरह कक्षाओं को रन टाइम पर बढ़ाया जाता है (हालांकि उसी उपकरण का उपयोग पोस्ट संकलन प्रसंस्करण के लिए किया जा सकता है)। अच्छी बात यह है कि एजेंट को JVM के अंदर से लोड किया जा सकता है जो सभी कमांड लाइनों को संभालने से बचाता है। अन्य विकल्पों पर सुनना अच्छा होगा।
    धन्यवाद,
    Avner

    0

    यहां कस्टम एनोटेशन को परिभाषित करने के लिए एक कोड उदाहरण है। यह @TesterInfo कक्षा स्तर पर लागू होता है, परीक्षक विवरण संग्रहित करता है। यह रिटर्न प्रकारों - enum, सरणी और स्ट्रिंग के विभिन्न उपयोग दिखाता है।

    package com.mkyong.test.core; 
    
    import java.lang.annotation.ElementType; 
    import java.lang.annotation.Retention; 
    import java.lang.annotation.RetentionPolicy; 
    import java.lang.annotation.Target; 
    
    @Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.TYPE) //on class level 
    public @interface TesterInfo { 
    
        public enum Priority { 
         LOW, MEDIUM, HIGH 
        } 
    
        Priority priority() default Priority.MEDIUM; 
    
        String[] tags() default ""; 
    
        String createdBy() default "Mkyong"; 
    
        String lastModified() default "03/01/2014"; 
    
    } 
    
    संबंधित मुद्दे