2012-03-09 12 views
6

मैं प्रतिबिंब और एनोटेशन के साथ खेलने की कोशिश कर रहा हूं। किसी भी कारण से जब भी मैं किसी फ़ील्ड (या कक्षा या विधि) में एनोटेशन जोड़ता हूं, और फ़ील्ड को देखने के लिए प्रतिबिंब का उपयोग करता हूं, तो मुझे लगता है कि इसका annotations फ़ील्ड शून्य है।प्रतिबिंबित करें। फ़ील्ड.नोटेशन हमेशा शून्य

उदाहरण के लिए, इस कोड:

public class Test { 
    public static void main(String[] args) throws NoSuchFieldException, SecurityException { 
     System.out.println(Test.class.getField("bl").getAnnotations().length); 
    }  
    @anno 
    public int bl;  

    public @interface anno {}  
} 

प्रिंट 0.

Btw, जावा सामान्य रूप में एनोटेशन की अनदेखी नहीं है, और जब (उदाहरण के लिए) मैं @Deprecated एनोटेशन का उपयोग करें - ग्रहण यह पहचानता है और मुझे बताता है कि कक्षा बहिष्कृत है।

मैं ग्रहण इंडिगो और जावा एसई विकास किट 7 अपडेट का उपयोग कर रहा हूं 2. धन्यवाद!

उत्तर

22

डिफ़ॉल्ट रूप से, एनोटेशन प्रतिबिंब के लिए उपलब्ध नहीं हैं। ऐसा करने के लिए है, तो आप अवधारण नीति को बदलने की जरूरत है, यानी

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

विभिन्न अवधारण नीतियों Javadoc में पाया जा सकता। डिफ़ॉल्ट (रहस्यमय कारणों से जो किसी को भी पता नहीं है) CLASS है।

+0

skaffman - आप आदमी हैं !! – Ginandi

+1

@ गिनंडी: आपसे ऐसा कहने में अच्छा लगा :) किसी ने अभी भी एक डाउनवोट के लायक विचार किया है, आपको लगता है ... – skaffman

+1

@skaffman कृपया आप प्रतिधारण पर किराये पर प्रतिस्थापित कर सकते हैं –

4

मैं @Retention उदा।

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Deprecated { 
} 

यदि आप इसे सेट नहीं करते हैं, तो यह रनटाइम पर दिखाई नहीं देगा।

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