2013-05-16 13 views
38

tworzę mój adnotacjilistę pól z adnotacją, dostać za pomocą refleksji

public @interface MyAnnotation { 
} 

I umieścić go na polach w moim badanego obiektu

public class TestObject { 

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

Teraz chcę listę wszystkich pól z dostać MyAnnotation.

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

Ale wydaje się moim bloku zrobić akcja nie jest wykonywana, a pola nie ma adnotacji jak poniższy kod zwraca 0.

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

Czy ktoś może mi pomóc i powiedzieć mi, co robię źle?

+0

1) W celu lepszego pomocą wcześniej, POST [SSCCE] (http://sscce.org/). 2) Proszę dodać dużą literę na początku zdania. Używaj również kapitału dla słowa I i nazw własnych, takich jak Java, oraz skrótów i akronimów takich jak JEE lub WAR. Ułatwia to ludziom zrozumienie i pomoc. –

+0

możliwy duplikat [Jak uzyskać adnotacje zmiennej członkowskiej?] (Http://stackoverflow.com/questions/4453159/how-to-get-annotations-of-a-member-variable) – fglez

Odpowiedz

54

Należy zaznaczyć adnotację jako dostępną w czasie wykonywania. Dodaj następujące elementy do kodu komentarza.

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

To prawda. Ale pomyślałem, że adnotacja jest do użycia w czasie wykonywania. – wrivas

+3

@wrivas Nie wszystkie adnotacje dotyczą środowiska wykonawczego. Na przykład '@ SuppressWarnings' to RetentionPolicy.SOURCE, ponieważ jest to tylko wskazówka dla kompilatora, aby nie ostrzegał o pewnych rzeczach. – Patrick

+0

Adnotacje są przeznaczone tylko dla źródła (do przeczytania), czasu kompilacji lub środowiska wykonawczego –

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 ma tę funkcjonalność: FieldUtils.getFieldsListWithAnnotation (...) – DBK

Powiązane problemy