2010-07-27 16 views
13

Używam refleksji, aby sprawdzić, czy adnotacja dołączona do właściwości klasy jest określonego typu. Aktualny robie:Sprawdzanie, czy adnotacja jest określonego typu

if("javax.validation.Valid".equals(annotation.annotationType().getName())) { 
    ... 
} 

Które wydaje mi się trochę kludgey ponieważ opiera się na sznurku, który jest w pełni kwalifikowana nazwa-klasy. Jeśli przestrzeń nazw zmieni się w przyszłości, może to spowodować subtelne błędy.

chciałbym zrobić:

if(Class.forName(annotation.annotationType().getName()).isInstance(
    new javax.validation.Valid() 
)) { 
    ... 
} 

Ale javax.validation.Valid jest klasą abstrakcyjną i nie może być instancja. Czy istnieje sposób na symulowanie instanceof (lub zasadniczo używać isInstance) przeciwko interfejsowi lub klasie abstrakcyjnej?

Odpowiedz

32

Czy po prostu patrząc na

if (annotation.annotationType().equals(javax.validation.Valid.class)){} 

?

4

Ok, chyba powinienem był zrobić trochę więcej badań przed opublikowaniem pytania. Odkryłem, że mogę używać Class.isAssignableFrom(Class<?> cls):

import javax.validation.Valid; 

if(Valid.class.isAssignableFrom(annotation.annotationType())) { 
    ... 
} 

Wydaje się, aby wykonać zadanie. Nie jestem jednak pewien, czy istnieją jakiekolwiek zastrzeżenia do zastosowania tego podejścia.

+1

Jest to rodzaj przesady, ponieważ i tak nie wolno rozszerzać adnotacji. Nie wiem, czy jest jakaś istotna kara za wydajność w porównaniu do zwykłych równych. – Affe

+0

@Affe Widziałem twoje rozwiązanie - nie wiedziałem, że możesz po prostu zrobić '.equals' lub' == 'na' .class'! Dziękuję za to. Miałem wrażenie, że użycie '.class' po prostu porównuje obiekty' Class', a nie rzeczywiste typy. –

+1

Klasa jest w rzeczywistości singleton. Gwarantuje się, że istnieje tylko jedno wystąpienie obiektu klasy dla danego typu dla każdego programu ładującego klasy, więc można je porównać w ten sposób w java. – Affe

2

Od adnotacja jest po prostu klasa, można po prostu użyć == porównać:

if (annotation.annotationType() == Valid.class) { /* ... */ } 
7

Tylko dla kompletności boską, inną możliwością jest

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) { 
14

Albo jeszcze prościej:

+0

Myślę, że ta odpowiedź powinna być wyższa. Jeśli chcesz tylko sprawdzić, czy instancja adnotacji jest określonego typu, po prostu użyj instanceOf, ponieważ jest to prostsze niż wykonanie adnotation.annotationType(). Equals (javax.validation.Valid.class) – adevine

+3

Po prostu obserwacja, to będzie zawsze fałszywe, jeśli programista zapomni dodać adnotację do @ interfejsu za pomocą '@Retention (value = RUNTIME)' – Felype

Powiązane problemy