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?
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
@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. –
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