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 :

Problème avec des annotations


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut Problème avec des annotations
    Hello,

    Je voudras accéder à une annotation par introspéction mais je n'y arrive pas, il me retourne toujours null...

    Qqch est il faux?

    P.S. J'utilise déja l'introspéction sur le Field[] f et ça marche très bien, il n'y a que les annotations qui...

    Merci d'avance!!

    J'ai une annotation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public @interface range {
        double min();
     
        double max();
    }
    Et un fichier Config01.java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Config01{
     
        @range(min=1, max=9)
        public byte byteS = 0;
     
        public Config01() throws ConfigException {
            String xmlFile = "xml/config.xml";
            new Configuration(this, xmlFile);
        }    
    }
    qui contient des annotations...

    Configuration.java:
    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
    public class Configuration {
     
        public Configuration(Object o, String xmlFile) throws ConfigException {
     
            SAXParserFactory factory = SAXParserFactory.newInstance();
            try {
                factory.setValidating(true);
                SAXParser saxParser = factory.newSAXParser();
     
                saxParser.parse(new File(xmlFile), new SaxParser(o) );
            } catch (FileNotFoundException t){
                // The specified file doesn't exist
                throw new ConfigException(ConfigException.FILE_NOT_FOUND);
            } catch (Throwable t) {
                // Another error occured, for example, the XML isn't correct
                try {
                    throw t;
                } catch (Throwable e) {e.printStackTrace();}
            } 
        }    
    }
    Et une partie de mon SaxParser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Class<?> c = null;    
     Field[] f = null;
    ...
    c=this.o.getClass();
    f=c.getDeclaredFields();
    ...
    range ann = f[index].getClass().getAnnotation(range.class);
        if(ann!=null){
           ... // ne passe jamais par là...
        }
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Je crois qu'il faut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Retention(RetentionPolicy.RUNTIME)

  3. #3
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    Et il faut ajouter ça ou?
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  4. #4
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    OK, j'ai modifié mon annotation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.lang.annotation.*;
    
    @Retention(RetentionPolicy.CLASS)
    public @interface range {
        double min();    
        double max();
    }
    C'est tout à fait correct, et merci pour cette remarque!

    Mais j'ai toujours le même problème!!

    Une idée supplémentaire?
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Pour avoir les annotations au runtime, il faut choisir la policy RetentionPolicy.RUNTIME. C'est indiqué ici

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faut rajouter @Retention(RetentionPolicy.RUNTIME) et non pas @Retention(RetentionPolicy.CLASS) !!!

    Les Annotations : @Retention

    a++

  7. #7
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    Oui, pardon, c'est avec RUNTIME que j'ai fait les tests... J'ai mis CLASS pour tester après...

    Donc voici mon annotation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.lang.annotation.*;
     
    @Retention(RetentionPolicy.RUNTIME)
    public @interface range {
        double min();    
        double max();
    }
    Et le problème persiste!!!
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range ann = f[index].getClass().getAnnotation(range.class);
    Tu récupères l'annotation sur le type class de l'attribut et non pas sur l'attribut lui même... Tu recherches donc l'attribut sur la classe array byte[] et non pas sur l'attribut bytes de ta classe.

    Il faut appeler getAnnotation() directement sur ton objet Field :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range ann = f[index].getAnnotation(range.class);
    a++

  9. #9
    Membre actif Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Points : 221
    Points
    221
    Par défaut
    Ben ouais...
    Bien joué!

    Et un grand merci!!

    A+
    (\ _ /)
    (='.'=)
    (")-(")
    Deux règles du succès:
    1) Ne communiquez jamais à quelqu'un tout votre savoir...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problèmes avec des annotations sur mon Mac
    Par fk04 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 08/09/2010, 21h54
  2. Problème avec des composants non déclarés
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/01/2005, 11h17
  3. Réponses: 5
    Dernier message: 19/08/2004, 11h11
  4. [STRUTS] Problème avec des ActionForm
    Par zarbydigital dans le forum Struts 1
    Réponses: 2
    Dernier message: 29/03/2004, 13h49
  5. Problèmes avec des vues
    Par dady dans le forum MFC
    Réponses: 22
    Dernier message: 09/01/2004, 16h26

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