2010-07-27 5 views
13

Sto utilizzando la riflessione per verificare se un'annotazione associata a una proprietà di una classe è di un tipo specifico. Corrente che sto facendo:Verifica se un'annotazione è di un tipo specifico

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

Il che mi sembra un po 'kludgey perché si basa su una stringa che è una classe-nome completo. Se lo spazio dei nomi cambia in futuro, ciò potrebbe causare errori impercettibili.

vorrei fare:

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

Ma javax.validation.Valid è una classe astratta e non può essere istanziata. C'è un modo per simulare lo instanceof (o fondamentalmente usare isInstance) contro un'interfaccia o una classe astratta?

risposta

32

Stai solo cercando

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

?

4

Ok, suppongo che avrei dovuto fare qualche ricerca in più prima di postare la domanda. Ho scoperto che avrei potuto usare Class.isAssignableFrom(Class<?> cls):

import javax.validation.Valid; 

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

Questo sembra fare il lavoro. Non sono sicuro se ci siano dei problemi nell'usare questo approccio, però.

+1

È una specie di eccessivo poiché è illegale estendere un'annotazione in ogni caso. Non so se ci sia una penalità prestazionale significativa rispetto ai normali eguali. – Affe

+0

@Affe Ho visto la tua soluzione - non sapevo che potevi semplicemente fare un '.equals' o un' == 'su' .class'! Grazie per quello. Ho avuto l'impressione che l'uso di '.class' confronti semplicemente gli oggetti' Class' e non i tipi reali. –

+1

La classe è effettivamente un singleton. È garantito che esiste una sola istanza dell'oggetto Class per un determinato Type per classloader, quindi è possibile confrontarli in questo modo in java. – Affe

2

Dal un'annotazione è solo una classe, si può semplicemente utilizzare un == confrontare:

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

Solo per completezza, un'altra possibilità è

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

O ancora più semplice:

if (annotation instanceof Valid) { /* ... */ } 
+0

Penso che questa risposta dovrebbe essere più alta. Se vuoi solo vedere se un'istanza di Annotazione è di un particolare tipo, usa instanceOf, dato che è più semplice di annotation.annotationType(). Equals (javax.validation.Valid.class) – adevine

+3

Solo un'osservazione, questa sarà sempre false se il programmatore si dimentica di annotare @interface con '@Retention (value = RUNTIME)' – Felype

Problemi correlati