2012-04-10 13 views
18

मैं एक संपत्ति भी एक टिप्पणी है कहते हैं:मेटा-एनोटेशन के लिए एनोटेशन गुण पासिंग

@Named(name = "Steve") 
private Person person 

और मैं एक है कि एक संपत्ति लेता सहित कई मेटा-एनोटेशन, के साथ एक यौगिक एनोटेशन बनाना चाहते हैं

@Named 
@AnotherAnnotation 
@YetAnotherAnnotation 
public @interface CompoundAnnotation { 

    ... 
} 

क्या कोई तरीका है कि मैं मेटा एनोटेशन में से किसी एक को यौगिक एनोटेशन में गुण पास कर सकता हूं?

जैसे, कुछ इस तरह:

@CompoundAnnotation(name = "Bob") 
private Person person; 

कि के बराबर है, लेकिन बहुत

@Named(name = "Bob") 
@AnotherAnnotation 
@YetAnotherAnnotation 
private Person person; 

धन्यवाद से अधिक सुविधाजनक है!

पीएस एक उदाहरण एनोटेशन की मेरी खराब पसंद के लिए माफ़ी माँगता है - मेरे पास javax.inject नहीं था। @ नामित एनोटेशन मन में, कुछ मनमाने ढंग से एनोटेशन जिसमें गुण हैं।


आपके उत्तरों/टिप्पणियों के लिए सभी को धन्यवाद।

यह निश्चित रूप से ऐसा लगता है कि यह संभव नहीं है। हालांकि, ऐसा होता है कि मेरे केस-इन-पॉइंट के लिए एक साधारण काम है, जो किसी भी व्यक्ति की मदद करता है:

मैं वसंत के साथ काम कर रहा हूं और अपनी खुद की टिप्पणियां बनाना चाहता हूं जिनके पास @ मेटा-एनोटेशन के रूप में घटक, इस प्रकार घटक स्कैनिंग द्वारा स्वत: पता लगाया जा रहा है। हालांकि, मैं भी बीननाम संपत्ति (@ कॉम्पोनेंट में मूल्य संपत्ति के अनुरूप) सेट करने में सक्षम होना चाहता था, इसलिए मेरे पास कस्टम बीन नाम हो सकते थे।

वैसे यह पता चला है कि वसंत के विचारशील लोगों ने ऐसा करना संभव बना दिया - एनोटेशनबीननाम जेनरेटर जो भी एनोटेशन पारित किया गया है उसका 'मूल्य' संपत्ति ले जाएगा और इसे बीन नाम (और निश्चित रूप से, डिफ़ॉल्ट, यह केवल उन टिप्पणियों को पारित कर देगा जो @ कॉम्पोनेंट हैं या मेटा-एनोटेशन के रूप में @ कॉम्पोनेंट हैं)। पूर्व-निरीक्षण में यह शुरुआत से मेरे लिए स्पष्ट होना चाहिए था - इस प्रकार @ कॉम्पोनेंट के साथ मेटा-एनोटेशन के रूप में मौजूदा टिप्पणियां, जैसे @ सेवा और @ रजिस्ट्री, बीन नाम प्रदान कर सकती हैं।

आशा है कि किसी के लिए उपयोगी है। मुझे अभी भी लगता है कि यह शर्म की बात है कि हालांकि यह संभवतः अधिक संभव नहीं है!

+0

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

+0

बस जोर से सोचते हुए, क्या यह एक वर्कअराउंड नहीं होगा यदि आपके पास अन्य एनीोटेशन और वाईएए के साथ एनोटेटेड बेस क्लास था, और फिर पर्सन क्लास ने इसे बढ़ाया? प्रतिबिंबों को भी देखें, शायद आपको कुछ विचार मिलेंगे: http://code.google.com/p/reflections/ – maksimov

+0

http://stackoverflow.com/questions/1624084/why-is-not- संभावित- टू-विस्तार-एनोटेशन में जावा – Gray

उत्तर

6

क्या कोई तरीका है कि मैं मेटा एनोटेशन में से किसी एक को यौगिक एनोटेशन में गुण पास कर सकता हूं?

मुझे लगता है कि सरल जवाब "नहीं" है। Person से पूछने का कोई तरीका नहीं है कि इसके लिए कौन सी टिप्पणियां हैं और उदाहरण के लिए @Named प्राप्त करें।

अधिक जटिल जवाब यह है कि आप एनोटेशन चेन कर सकते हैं लेकिन आपको प्रतिबिंब के माध्यम से इन टिप्पणियों की जांच करनी होगी।उदाहरण के लिए, निम्न कार्य:

@Bar 
public class Foo { 
    public static void main(String[] args) { 
     Annotation[] fooAnnotations = Foo.class.getAnnotations(); 
     assertEquals(1, fooAnnotations.length); 
     for (Annotation annotation : fooAnnotations) { 
      Annotation[] annotations = 
       annotation.annotationType().getAnnotations(); 
      assertEquals(2, annotations.length); 
      assertEquals(Baz.class, annotations[0].annotationType()); 
     } 
    } 

    @Baz 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface Bar { 
    } 

    @Retention(RetentionPolicy.RUNTIME) 
    public @interface Baz { 
    } 
} 

हालांकि निम्नलिखित बयान अशक्त वापस आ जाएगी:

// this always returns null 
Baz baz = Foo.class.getAnnotation(Baz.class) 

इसका मतलब यह है कि किसी भी 3 पार्टी वर्ग कि @Baz एनोटेशन की तलाश में है यह नहीं देख सकेंगे।

14

यह कुछ साल बाद है, और चूंकि आप वसंत का उपयोग कर रहे हैं, आप जो पूछ रहे हैं वह @AliasFor एनोटेशन का उपयोग करके अब संभव है।

उदाहरण के लिए:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@SpringApplicationConfiguration 
@ActiveProfiles("test") 
public @interface SpringContextTest { 

    @AliasFor(annotation = SpringApplicationConfiguration.class, attribute = "classes") 
    Class<?>[] value() default {}; 

    @AliasFor("value") 
    Class<?>[] classes() default {}; 
} 

अब आप @SpringContextTest(MyConfig.class) के साथ अपने परीक्षण टिप्पणी कर सकते हैं, और अद्भुत बात यह है कि यह वास्तव में जिस तरह से आप उम्मीद करेंगे काम करता है।

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