2010-07-27 13 views
13

Estoy usando la reflexión para ver si una anotación que se adjunta a una propiedad de una clase, es de un tipo específico. En el que estoy haciendo:Comprobando si una anotación es de un tipo específico

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

que me parece un poco kludgey porque se basa en una cadena que es una clase de nombre completo. Si el espacio de nombres cambia en el futuro, esto podría causar errores sutiles.

me gusta hacer:

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

Pero javax.validation.Valid es una clase abstracta y no puede ser instanciada. ¿Hay alguna manera de simular instanceof (o básicamente usar isInstance) en una interfaz o clase abstracta?

Respuesta

32

simplemente estás buscando

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

?

4

Ok, creo que debería haber investigado un poco antes de publicar la pregunta. Descubrí que podía usar Class.isAssignableFrom(Class<?> cls):

import javax.validation.Valid; 

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

Esto parece hacer el trabajo. Sin embargo, no estoy seguro de si hay alguna advertencia al usar este enfoque.

+1

Es un poco exagerado, ya que es ilegal extender una anotación de todos modos. No sé si hay una penalización significativa en el rendimiento en comparación con la igualdad simple. – Affe

+0

@Affe Vi su solución - ¡No sabía que podría simplemente hacer un '.equals' o un '==' en '.class'! Gracias por eso. Tenía la impresión de que usar '.class' simplemente compara los objetos' Clase' y no los tipos reales. –

+1

La clase es efectivamente un singleton. Se garantiza que solo hay una instancia del objeto Clase para un Tipo determinado por cargador de clases, por lo que puede compararlos de esa manera en Java. – Affe

2

Desde una anotación es sólo una clase, sólo tiene que utilizar una comparación ==:

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

sólo por el bien integridad, otra posibilidad es

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

O aún más simple:

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

Creo que esta respuesta debería ser mayor. Si solo quiere ver si una instancia de Anotación es de un tipo particular, solo use instanceOf, ya que es más sencillo que hacer anotación.annotationType(). Equals (javax.validation.Valid.class) – adevine

+3

Solo una observación, esto será siempre es falso si el programador olvida anotar la @interface con '@Retention (value = RUNTIME)' – Felype

Cuestiones relacionadas