2013-05-16 10 views
38

का उपयोग करके एनोटेशन, साथ क्षेत्रों की सूची प्राप्त करें मैं बना मेरी एनोटेशनप्रतिबिंब

public @interface MyAnnotation { 
} 

मैं अपने परीक्षण वस्तु में खेतों पर डाल दिया

public class TestObject { 

    @MyAnnotation 
    final private Outlook outlook; 
    @MyAnnotation 
    final private Temperature temperature; 
    ... 
} 

अब मैं के साथ सभी फ़ील्ड की सूची प्राप्त करना चाहते हैं MyAnnotation

for(Field field : TestObject.class.getDeclaredFields()) 
{ 
    if (field.isAnnotationPresent(MyAnnotation.class)) 
     { 
       //do action 
     } 
} 

लेकिन मेरी ब्लॉक की तरह लगता है कर कार्रवाई कभी नहीं निष्पादित किया जाता है, और निम्न कोड के रूप में देता है 0.

TestObject.class.getDeclaredField("outlook").getAnnotations().length; 

किसी को भी मेरी मदद और मुझे बताओ कि मैं क्या कर रहा हूँ कर सकते हैं है क्षेत्रों कोई टिप्पणी नहीं है गलत?

+0

1) बेहतर मदद जल्दी के लिए, एक [SSCCE] (http://sscce.org/) पोस्ट करते हैं। 2) वाक्यों की शुरुआत में एक ऊपरी केस अक्षर जोड़ें। शब्द I और जावा जैसे उचित नामों के लिए पूंजी का उपयोग करें, और संक्षेप और जेईई या युद्ध जैसे शब्दकोष। यह लोगों को समझने और मदद करने में आसान बनाता है। –

+0

संभावित डुप्लिकेट [सदस्य चर के एनोटेशन कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/4453159/how-to-get-annotations-of-a-member-variable) – fglez

उत्तर

54

आपको एनोटेशन को रनटाइम पर उपलब्ध होने के रूप में चिह्नित करने की आवश्यकता है। अपने एनोटेशन कोड में निम्नलिखित जोड़ें।

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyAnnotation { 
} 
+0

यह सही है। लेकिन, मैंने सोचा कि एनोटेशन रनटाइम उपयोग के लिए है। – wrivas

+3

@wrivas सभी एनोटेशन रनटाइम के लिए नहीं हैं। उदाहरण के लिए '@ SuppressWarnings' RetentionPolicy.SOURCE है क्योंकि यह केवल कुछ चीजों के बारे में चेतावनी देने के लिए संकलक को संकेत नहीं देता है। – Patrick

+0

एनोटेशन केवल स्रोत के लिए हैं (आपके लिए पढ़ने के लिए), संकलन समय या रनटाइम –

6
/** 
* @return null safe set 
*/ 
public static Set<Field> findFields(Class<?> classs, Class<? extends Annotation> ann) { 
    Set<Field> set = new HashSet<>(); 
    Class<?> c = classs; 
    while (c != null) { 
     for (Field field : c.getDeclaredFields()) { 
      if (field.isAnnotationPresent(ann)) { 
       set.add(field); 
      } 
     } 
     c = c.getSuperclass(); 
    } 
    return set; 
} 
+11

अपाचे कॉमन्स में यह कार्यक्षमता है: FieldUtils.getFieldsListWithAnnotation (...) – DBK