IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Annotation héritant du comportement d'une autre annotation


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Par défaut Annotation héritant du comportement d'une autre annotation
    Bonjour à tous,

    Je vous explique mon problème. J'utilise l'annotation de Spring suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @IfProfileValue(name = "test-group", value ="integration")
    Cependant je souhaitais la simplifier afin de pouvoir la standardiser sur tous les projets. J'ai donc pensé recréer une annotation comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @IfProfileValue(name = "test-group", value = "integration")
    public @interface IntegrationTest {}
    Cependant ça ne fonctionne pas. Lorsque je remplace l'annotation Spring par la mienne (@IntegrationTest), le comportement de l'annotation Spring n'est pas hérité.

    Pour info la signature de l'annotation @IfProfileValue est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface IfProfileValue {
    ...
    }
    Une idée? Cela est-il réalisable simplement?

    Merci!

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Les annotations ne supportent pas l'héritage. Peut-être en passant par la composition ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Target( { ElementType.TYPE, ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface IntegrationTest {
      IfProfileValue profile() default @IfProfileValue(name = "test-group", value = "integration");
     
      String[] users();
    }
    et un programme de test en exemple de ce qu'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    @IfProfileValue(name = "test-user", value = "development")
    @IntegrationTest(users = { "abc", "def" })
    public class Test {
     
      enum EnumAnnotationPolicy {
        EXCLUSIVE, OVERRIDES, IGNORE
      };
     
      Test() {
     
        boolean integrationTestAnnotationContainsIfProfileAnnotation = contains(
            IntegrationTest.class, IfProfileValue.class);
     
        IntegrationTest a = getClass().getAnnotation(IntegrationTest.class);
        if (a != null) {
          System.out.println("a.profile=" + a.profile());
          System.out.println("a.users=" + Arrays.toString(a.users()));
        }
     
        IfProfileValue b = getClass().getAnnotation(IfProfileValue.class);
        if (b != null) {
          System.out.println("b.name=" + b.name());
          System.out.println("b.value=" + b.value());
        }
     
        if (a != null && b != null
            && integrationTestAnnotationContainsIfProfileAnnotation) {
          for (EnumAnnotationPolicy policy : EnumAnnotationPolicy.values()) {
            switch (policy) {
            case EXCLUSIVE:
              System.out.println("Les annotations "
                  + IntegrationTest.class.getSimpleName() + " et "
                  + IfProfileValue.class.getSimpleName()
                  + " sont mutuellement exclusives");
              break;
     
            case OVERRIDES:
              System.out.println("L'annotation "
                  + IntegrationTest.class.getSimpleName()
                  + " est overridee par l'annotation "
                  + IfProfileValue.class.getSimpleName());
              break;
     
            case IGNORE:
              System.out.println("L'annotation "
                  + IfProfileValue.class.getSimpleName()
                  + " est ignoree au profit de l'annotation "
                  + IntegrationTest.class.getSimpleName());
              break;
            }
          }
        }
      }
     
      private static boolean contains(Class<? extends Annotation> container,
          Class<? extends Annotation> content) {
     
        boolean contains = false;
     
        for (Method method : container.getDeclaredMethods()) {
          if (method.getReturnType() == content) {
            System.out.println("L'annotation " + container.getSimpleName()
                + " contient la méthode '" + method.getName()
                + "' renvoyant une annotation " + content.getSimpleName());
            contains = true;
            break;
          }
        }
        return contains;
      }
     
      public static void main(String[] args) {
        new Test();
      }
    }

Discussions similaires

  1. Ajouter des méthodes à une classe annotée
    Par ThomasEscolan dans le forum Langage
    Réponses: 2
    Dernier message: 04/09/2012, 17h29
  2. Comportement des constructeurs dans une autre methode
    Par Rewpparo dans le forum Langage
    Réponses: 11
    Dernier message: 03/04/2012, 00h16
  3. Cobertura & Sonar ne couvrent pas une classe annotée/étendue
    Par aknot13 dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 15/11/2011, 17h52
  4. [CSS] Classe héritant déf d une autre classe?!
    Par Trunks dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/01/2006, 23h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo