2013-05-16 16 views
38

erstelle ich meine AnmerkungGet Liste der Felder mit Kommentierung, durch Reflexion mit

public @interface MyAnnotation { 
} 

Ich habe es auf Felder in meinem Testobjekt

public class TestObject { 

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

Jetzt möchte ich Liste aller Felder bekommen MyAnnotation.

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

aber scheint, wie mein Block tun Aktion nie ausgeführt wird, und Felder hat keine Anmerkung wie der folgende Code 0.

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

Ist wieder jemand kann mir helfen und mir zu sagen, was ich tue falsch?

+0

1) Für eine bessere Hilfe früher, buchen eine [SSCCE] (http://sscce.org/). 2) Bitte fügen Sie am Anfang der Sätze einen Großbuchstaben hinzu. Verwenden Sie auch ein Kapital für das Wort I & Eigennamen wie Java und Abkürzungen und Akronyme wie JEE oder WAR. Dies erleichtert es den Menschen, zu verstehen und zu helfen. –

+0

möglich Duplikat von [Wie bekomme ich Anmerkungen von einer Mitgliedsvariablen?] (Http://stackoverflow.com/questions/4453159/how-to-get-annotations-of-a-member-variable) – fglez

Antwort

54

Sie müssen die Anmerkung zur Laufzeit als verfügbar markieren. Fügen Sie Ihrem Anmerkungscode Folgendes hinzu.

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

Es ist korrekt. Aber ich dachte, die Annotation ist für die Laufzeit geeignet. – wrivas

+3

@wrivas Nicht alle Anmerkungen sind für die Laufzeit. Zum Beispiel ist '@ SuppressWarnings' RetentionPolicy.SOURCE, da es nur ein Hinweis für den Compiler ist, nicht über bestimmte Dinge zu warnen. – Patrick

+0

Anmerkungen sind nur für Quelle (zum Lesen), Kompilierzeit oder Laufzeit –

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

Apache Commons hat diese Funktionalität: FieldUtils.getFieldsListWithAnnotation (...) – DBK

Verwandte Themen