2013-08-29 18 views
15

JavaDoc mówi co następuje:Różnica między Pole # getAnnotations() i pole # getDeclaredAnnotations()

AccessibleObject#getDeclaredAnnotations:

zwraca wszystkie adnotacje, które są bezpośrednio obecny na tym elemencie. W przeciwieństwie do innych metod w tym interfejsie, ta metoda ignoruje odziedziczone adnotacje. (Zwraca tablicę o długości zero, jeśli adnotacje nie są bezpośrednio obecne w tym elemencie.) Wywoływacz tej metody może dowolnie modyfikować zwróconą tablicę; nie wpłynie to na tablice zwracane innym rozmówcom.

Field#getAnnotations:

zwraca wszystkie adnotacje znajdujące się na tym elemencie. (Zwraca tablicę o długości zero, jeśli ten element nie ma adnotacji.) Wywoływacz tej metody może dowolnie modyfikować zwróconą tablicę; nie wpłynie to na tablice zwracane innym rozmówcom.

Od getAnnotations jest dziedziczona po klasie java.lang.reflect.AccessibleObject, mają dostęp do obiektów Field.

Jak rozumiem, jest to jedyna różnica między nimi, że getDeclaredAnnotations ignoruje odziedziczone adnotacje. Rozumiem, że w kontaktach z klasami, ale o ile wiem, Fields NIE może dziedziczyć adnotacji.

Odpowiedz

9

Patrząc w kod źródłowy daje odpowiedź:

Wyciąg z java.lang.reflect.AccessibleObject:

/** 
* @since 1.5 
*/ 
public Annotation[] getAnnotations() { 
    return getDeclaredAnnotations(); 
} 

/** 
* @since 1.5 
*/ 
public Annotation[] getDeclaredAnnotations() { 
    throw new AssertionError("All subclasses should override this method"); 
} 

A ponieważ Field does not override getAnnotations(): getDeclaredAnnotations() nazywa.

Tak więc obie metody robią to samo po wywołaniu obiektu java.lang.reflect.Field. (tak JavaDoc jest źle moim zdaniem)

drugi przypadek jest java.lang.Class który zastępuje obie metody (i robi to, co jest JavaDoc mówi;)):

/** 
* @since 1.5 
*/ 
public Annotation[] getAnnotations() { 
    initAnnotationsIfNecessary(); 
    return AnnotationParser.toArray(annotations); 
} 

/** 
* @since 1.5 
*/ 
public Annotation[] getDeclaredAnnotations() { 
    initAnnotationsIfNecessary(); 
    return AnnotationParser.toArray(declaredAnnotations); 
} 
-1

Jest odwrotnie. getDeclaredAnnotations() - jak mówią docs - jest jedyną metodą, która ignoruje odziedziczone adnotacje.

Poniżej znajduje się fragment, który demostrates różnicę:

public class Test1 { 
    public static void main(String[] args) { 
     Test3 test = new Test3(); 

     for (Annotation annotation : test.getClass().getAnnotations()) { 
      System.out.println("Class getAnnotations: " + annotation); 
     } 

     for (Annotation annotation : test.getClass().getDeclaredAnnotations()) { 
      System.out.println("Class getDeclaredAnnotations: " + annotation); 
     } 

     for (Field field : test.getClass().getFields()) { 
      for (Annotation annotation : field.getAnnotations()) { 
       System.out.println("Field getAnnotations: " + annotation); 
     } 

     for (Annotation annotation : field.getDeclaredAnnotations()) { 
      System.out.println("Field getDeclaredAnnotations: " + annotation); 
     } 
    } 
} 

@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
@interface CustomAnnotation { 
    String value(); 
} 

@CustomAnnotation("Class") 
class Test2 { 
    @CustomAnnotation("Field") public String testString; 
} 

class Test3 extends Test2 {} 

wyjście będzie `getAnnotations:

Class getAnnotations: @test.CustomAnnotation(value=Class) 
Field getAnnotations: @test.CustomAnnotation(value=Field) 
Field getDeclaredAnnotations: @test.CustomAnnotation(value=Field) 

Zobaczysz, że Class getDeclaredAnnotations() jest pusta, ponieważ klasa Test3 nie posiada Adnotacje się, tylko odziedziczone z Test2.

Z Javadoc dla @Inherited:

Wskazuje, że typ adnotacji jest automatycznie dziedziczona. Jeśli w deklaracji typu adnotacji znajduje się Odziedziczona meta-adnotacja, a użytkownik zapyta o typ adnotacji w deklaracji klasy, a deklaracja klasy nie ma adnotacji dla tego typu, to nadklasa klasy zostanie automatycznie zapytana o typ adnotacji. Ten proces zostanie powtórzony do momentu znalezienia adnotacji dla tego typu lub osiągnięcia najwyższej hierarchii klas (obiektu). Jeśli żadna nadklasa nie ma adnotacji dla tego typu, to zapytanie wskaże, że dana klasa nie ma takiej adnotacji. Zauważ, że ten typ meta-adnotacji nie ma zastosowania, jeśli typ z adnotacjami jest używany do opisywania niczego poza klasą. Zauważ również, że ta meta-adnotacja powoduje, że adnotacje są dziedziczone po nadklasach; adnotacje na zaimplementowanych interfejsach nie mają wpływu.

+1

Jak to się ma do "pola"? Także OP-y dostaję to, kiedy mam do czynienia z Classes_ –

+0

wiem, jak to działa z Class, ale nie dostaję pola. ale dzięki za wskazanie, że pominęłem błąd –

+0

dziękuję za aktualizację Twojego fragmentu, ale nadal nie widzę różnicy między tymi metodami ... –

-1

getDeclaredAnnotations() zapewnia bezpośrednie realizowane adnotacji tylko w przypadku, gdy getAnnotations() dostarcza bezpośrednio zaimplementowane, a także dziedziczne adnotacje (@Inherited) z klasy nadrzędnej.

Powiązane problemy