155 votes

Est-il quelque chose comme Annotation de l'Héritage en java?

Je suis d'explorer les annotations et est venu à un point où certaines d'entre elles semble avoir une hiérarchie entre eux.

Je suis à l'aide d'annotations pour générer du code en arrière-plan pour les Cartes. Il existe différents types de Carte (donc un code différent et annotations), mais il y a certains éléments qui sont communs parmi eux comme un nom.

@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
 String method1();
 String method2();
}

Et ce serait la commune d'Annotation:

@Target(value = {ElementType.TYPE})
public @interface Page{
 String method3();
}

Dans l'exemple ci-dessus je m'attends à passer à hériter method3 mais je reçois un message d'avertissement disant que s'étend n'est pas valide avec les annotations. J'essayais d'avoir une Annotation s'étend une base commune mais qui ne fonctionne pas. Si, c'est possible ou c'est juste un problème de conception?

95voto

Grygoriy Gonchar Points 549

Vous pouvez annoter vos annotation avec la base de l'annotation à la place de l'héritage.

E. g. ce est utilisé dans framework Spring:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MovieQualifier {

  String genre();

  Format format();
}

Dans votre cas, le code ressemblera à:

@Target(value = {ElementType.TYPE})
@Page(method3="someValue")
public @interface Move {
 String method1();
 String method2();
}

@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface Page{
 String method3();
}

93voto

andronikus Points 2222

Malheureusement, aucune. Apparemment, il a quelque chose à voir avec les programmes qui lisent les annotations sur une classe sans les charger de toute façon. Voir Pourquoi n'est pas possible d'étendre les annotations en Java?

Cependant, les types de faire hériter les annotations de leur super-classe si ces annotations sont @Inherited.

Aussi, à moins que vous ayez besoin de ces méthodes pour interagir, vous pouvez simplement empiler les annotations sur votre classe:

@Move
@Page
public class myAwesomeClass {}

Est-il une raison qui ne fonctionne pas pour vous?

13voto

philnate Points 664

En plus de Grygoriys réponse de l'annotation annotations.

Vous pouvez vérifier par exemple, les méthodes pour contenant un @Qualifier d'annotation (ou une annotation annotée avec @Qualifier) par cette boucle:

for (Annotation a : Lists.newArrayList(method.getAnnotations())) {
    if (a.annotationType().isAnnotationPresent(Qualifier.class)) {
        System.out.println("found @Qualifier annotation");//found annotation having Qualifier annotation itself
    }
}

Ce que vous êtes essentiellement faire, c'est d'obtenir tous les annotations présentes sur la méthode et de ces annotations, vous obtenez leurs types et de vérifier ces types de si elles sont annotées avec @Qualifier. L'annotation doit être la Cible.Annotation_type permis ainsi d'obtenir ce travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X