J'explore les annotations et suis arrivé à un point où certaines annotations semblent avoir une hiérarchie entre elles.
J'utilise des annotations pour générer du code en arrière-plan pour les cartes. Il existe différents types de cartes (donc différents codes et annotations) mais certains éléments sont communs parmi eux comme un nom.
@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
String method1();
String method2();
}
Et ce serait l'annotation commune:
@Target(value = {ElementType.TYPE})
public @interface Page{
String method3();
}
Dans l'exemple ci-dessus, je m'attendrais à ce que Move hérite de la méthode 3, mais je reçois un avertissement indiquant que l'extension n'est pas valide avec les annotations. J'essayais d'avoir une annotation qui étend une base commune mais cela ne fonctionne pas. Est-ce même possible ou est-ce juste un problème de conception?
java
inheritance
annotations
javydreamercsw
la source
la source
Réponses:
Malheureusement non. Apparemment, cela a quelque chose à voir avec les programmes qui lisent les annotations sur une classe sans les charger complètement. Voir Pourquoi n'est-il pas possible d'étendre les annotations en Java?
Cependant, les types héritent des annotations de leur superclasse si ces annotations sont
@Inherited
.De plus, à moins que vous n'ayez besoin de ces méthodes pour interagir, vous pouvez simplement empiler les annotations sur votre classe:
Y a-t-il une raison qui ne fonctionnerait pas pour vous?
la source
Vous pouvez annoter votre annotation avec une annotation de base au lieu de l'héritage. Ceci est utilisé dans le framework Spring .
Pour donner un exemple
Vous pouvez ensuite vérifier si une classe est annotée avec en
Vehicle
utilisant AnnotationUtils de Spring :Cette méthode est implémentée comme:
AnnotationUtils
contient également des méthodes supplémentaires pour rechercher des annotations sur des méthodes et d'autres éléments annotés. La classe Spring est également assez puissante pour rechercher dans des méthodes pontées, des proxies et d'autres cas de coin, en particulier ceux rencontrés dans Spring.la source
TYPE
ouANNOTATION_TYPE
.En plus de la réponse de Grygoriys des annotations d'annotations.
Vous pouvez vérifier par exemple les méthodes pour contenir une
@Qualifier
annotation (ou une annotation annotée avec@Qualifier
) par cette boucle:Ce que vous faites essentiellement, c'est d'obtenir toutes les annotations présentes sur la méthode et de ces annotations, vous obtenez leurs types et vérifiez ces types s'ils sont annotés avec @Qualifier. Votre annotation doit également être Target.Annotation_type activée pour que cela fonctionne.
la source
Consultez https://github.com/blindpirate/annotation-magic , qui est une bibliothèque que j'ai développée lorsque j'ai eu la même question.
la source