2010-09-10 14 views
16

यह पहेली मुझे। मेरे पास एक कस्टम एनोटेशन वाला एक वर्ग है और मुझे यह सत्यापित नहीं हो रहा है कि एनोटेशन मौजूद है। मुझसे यहां क्या गलत हो रहा है? अगर मैं MyOperationTest चलाने (नीचे देखें), मैं एक परिणाम के रूप में इस मिल:एनोटेशन अदृश्य?

implements Library.Operation: true 
has @Library.Marker: false 
Tada! 

Library.java:

package com.example.gotchas; 

public class Library { 
    private Library() {} 

    public @interface Marker {} 

    public interface Operation { 
     public void execute(); 
    } 
} 

MyOperation.java:

package com.example.gotchas; 

@Library.Marker 
public class MyOperation implements Library.Operation { 
    @Override public void execute() { 
     System.out.println("Tada!"); 
    } 
} 

MyOperationTest। जावा:

package com.example.gotchas; 

public class MyOperationTest { 
    static public void main(String[] args) 
    { 
     try { 
      Class<?> cl = Class.forName("com.example.gotchas.MyOperation"); 
      boolean implementsLibraryOperation = 
       Library.Operation.class.isAssignableFrom(cl); 
      boolean hasLibraryMarker = 
       cl.isAnnotationPresent(Library.Marker.class); 
      System.out.println("implements Library.Operation: " 
        +implementsLibraryOperation); 
      System.out.println("has @Library.Marker: "+hasLibraryMarker); 
      if (implementsLibraryOperation) 
      { 
       Class<? extends Library.Operation> opClass = 
        cl.asSubclass(Library.Operation.class); 
       Library.Operation op = opClass.newInstance(); 
       op.execute(); 
      } 
     } 
     catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     catch (InstantiationException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

उत्तर

26

अगर आप अपनी टिप्पणी के लिए @Retention परिभाषित करने के लिए है:

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

अन्यथा एनोटेशन रनटाइम पर बनी रहती है।

(तुम भी स्पष्ट @Target(ElementType.TYPE) जोड़ सकते हैं अगर आप केवल वर्गों पर अपनी एनोटेशन के उपयोग को सीमित करना चाहते हैं)

एक sidenote के रूप - यह भीतरी वर्ग के रूप में एनोटेशन परिभाषित करने के लिए एक आम बात नहीं है।

+0

सहमत हुए। डिफ़ॉल्ट रूप से एनोटेशन रनटाइम के माध्यम से नहीं रखा जाता है ... संकलन के समय के बाद यह गिरा दिया जाता है। इसलिए जब आप अपना टेस्ट कोड चलाते हैं, तो एनोटेशन अब संकलित कोड का हिस्सा नहीं है। – RonU

+4

[RetentionPolicy javadoc] में अधिक जानकारी (http://download.oracle.com/javase/6/docs/api/java/lang/annotation/RetentionPolicy.html): * RUNTIME - एनोटेशन को कक्षा फ़ाइल में दर्ज किया जाना है कंपाइलर द्वारा और रन टाइम पर वीएम द्वारा बनाए रखा गया, ** इसलिए उन्हें प्रतिबिंबित रूप से पढ़ा जा सकता है **। * – BalusC

+0

आह! धन्यवाद!!!!! –

2

डिफ़ॉल्ट रूप से, एनोटेशन प्रतिधारण नीति CLASS है, जो आपकी एनोटेशन प्रतिबिंब के लिए उपलब्ध नहीं कराती है। एनोटेशन घोषित करते समय आपको इसे अर्हता प्राप्त करनी चाहिए।

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