Estou explorando anotações e cheguei a um ponto em que algumas anotações parecem ter uma hierarquia entre elas.
Estou usando anotações para gerar código em segundo plano para cartões. Existem diferentes tipos de cartões (portanto, códigos e anotações diferentes), mas existem certos elementos comuns entre eles, como um nome.
@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
String method1();
String method2();
}
E essa seria a anotação comum:
@Target(value = {ElementType.TYPE})
public @interface Page{
String method3();
}
No exemplo acima, eu esperaria que o Move herde o método3, mas recebo um aviso informando que estende não é válido com anotações. Eu estava tentando fazer uma anotação estender uma base comum, mas isso não funciona. Isso é possível ou é apenas uma questão de design?
java
inheritance
annotations
javydreamercsw
fonte
fonte
Respostas:
Infelizmente não. Aparentemente, tem algo a ver com programas que lêem as anotações em uma classe sem carregá-las até o fim. Consulte Por que não é possível estender anotações em Java?
No entanto, os tipos herdam as anotações de sua superclasse se essas anotações forem
@Inherited
.Além disso, a menos que você precise desses métodos para interagir, basta empilhar as anotações em sua classe:
Existe algum motivo que não funcionaria para você?
fonte
Você pode anotar sua anotação com uma anotação base em vez de herança. Isso é usado no framework Spring .
Para dar um exemplo
Você pode então verificar se uma classe está anotada
Vehicle
usando o AnnotationUtils do Spring :Este método é implementado como:
AnnotationUtils
também contém métodos adicionais para procurar anotações em métodos e outros elementos anotados. A classe Spring também é poderosa o suficiente para pesquisar métodos, proxies e outros casos extremos, principalmente aqueles encontrados no Spring.fonte
TYPE
ouANNOTATION_TYPE
.Além da resposta da Grygoriys de anotações.
Você pode verificar, por exemplo, métodos para conter uma
@Qualifier
anotação (ou uma anotação anotada com@Qualifier
) por este loop:O que você está basicamente fazendo é obter todas as anotações presentes no método e, dessas anotações, você obtém seus tipos e verifica esses tipos se eles estão anotados com @Qualifier. Sua anotação precisa estar também com Target.Annotation_type para que isso funcione.
fonte
Confira https://github.com/blindpirate/annotation-magic , que é uma biblioteca que desenvolvi quando tive a mesma pergunta.
fonte