Estoy explorando anotaciones y llegué a un punto en el que algunas anotaciones parecen tener una jerarquía entre ellas.
Estoy usando anotaciones para generar código en segundo plano para Cards. Hay diferentes tipos de tarjetas (por lo tanto, diferentes códigos y anotaciones) pero hay ciertos elementos que son comunes entre ellos, como un nombre.
@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
String method1();
String method2();
}
Y esta sería la anotación común:
@Target(value = {ElementType.TYPE})
public @interface Page{
String method3();
}
En el ejemplo anterior, esperaría que Move herede el método3, pero recibo una advertencia que dice que la extensión no es válida con anotaciones. Estaba tratando de que una Anotación extendiera una base común, pero eso no funciona. ¿Es eso posible o es solo una cuestión de diseño?
java
inheritance
annotations
javydreamercsw
fuente
fuente
Respuestas:
Lamentablemente no. Aparentemente tiene algo que ver con programas que leen las anotaciones en una clase sin cargarlas por completo. Consulte ¿Por qué no es posible ampliar las anotaciones en Java?
Sin embargo, los tipos heredan las anotaciones de su superclase si esas anotaciones lo son
@Inherited
.Además, a menos que necesite esos métodos para interactuar, puede apilar las anotaciones en su clase:
¿Hay alguna razón por la que no funcione para usted?
fuente
Puede anotar su anotación con una anotación base en lugar de una herencia. Esto se usa en el marco de Spring .
Para dar un ejemplo
Luego puede verificar si una clase está anotada
Vehicle
usando Spring's AnnotationUtils :Este método se implementa como:
AnnotationUtils
también contiene métodos adicionales para buscar anotaciones en métodos y otros elementos anotados. La clase Spring también es lo suficientemente poderosa como para buscar a través de métodos puenteados, proxies y otros casos de esquina, particularmente los encontrados en Spring.fuente
TYPE
oANNOTATION_TYPE
.Además de la respuesta de Grygoriy de anotar anotaciones.
Puede comprobar, por ejemplo, los métodos para contener una
@Qualifier
anotación (o una anotación anotada con@Qualifier
) por este bucle:Lo que básicamente está haciendo es obtener todas las anotaciones presentes en el método y de esas anotaciones obtiene sus tipos y verifica esos tipos si están anotados con @Qualifier. Su anotación debe estar habilitada para Target.Annotation_type también para que esto funcione.
fuente
Consulte https://github.com/blindpirate/annotation-magic , que es una biblioteca que desarrollé cuando tuve la misma pregunta.
fuente