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 :

pb introspection NoSuchFieldException


Sujet :

Langage Java

  1. #1
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut pb introspection NoSuchFieldException
    Bonjour, voila j' ai un problème que je ne comprend sur le principe de l'introspection.

    Je parcours une map d'objet, voici une partie de la déclaration de la class des objet contenu dans la map :
    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
     
    class TreeNode 
    		implements StructuralListener {
     
    	/** Used to create a unique reference number for each node. */
        private static int lastRefId = 0;
     
        /** Reference Id */
        private final String refId;
     
    	/** The originating object */
    	private final Object node;
     
    	/** And keep track of children. */
    	private final List/*<String>*/ children = new ArrayList();
    et voici mon code qui utilise l'introspection afin d'avoir la valeur de l'attribut node :
    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
     
    while(itor.hasNext())
    		{
    			Object k = itor.next();
    			Class classe = jobs.get(k).getClass();
    			Object obj = jobs.get(k);
    			Field champ = null;
     
    			try
    			{
    				champ = classe.getField("node");
    			}
    			catch(NoSuchFieldException ex)
    			{
    				ex.printStackTrace();
    			}
    			catch(SecurityException ex)
    			{
    				ex.printStackTrace();
    			}
     
    			Object val = champ.get(obj);
     
    			MenuComponent childComponent = new MenuComponent();
    			childComponent.setTitle(val.toString());
    			rootTree.addMenuComponent(childComponent);
    		}
    J'ai une exception NoSuchFieldException pour l'objet node pourtant il existe bien dans la classe et j'ai une méthode d'accés a cet objet public Object getNode().
    Pourquoi l'exception est elle lancée?
    Merci a tous.

  2. #2
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Il essaye de récupérer la valeur de "node" qui est privée, alors forcément il aime pas trop.

    Tu devrais plutôt appeler la méthode getNode(), qui elle est publique, et récupérer sa valeur.

    EDIT : J'imagine que tu viens du .NET avec une telle façon de faire. En JAVA, les get et set ne sont pas appelés automatiquement quand on fait un machin.truc , il faut appeler explicitement machin.getTruc()
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  3. #3
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Tu ne peux pas récupérer le champ directement avec getField si il est privé, à mon avis, tu vas devoir passer par un accesseur.

    Si tu es dans une autre classe que TreeNode, tu ne peux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TreeNode test = new TreeNode(...);
    test.node;
    ok, ben avec l'introspection c'est pareil ça suit le modèle de programmation objet il n'y a pas de miracle...

  4. #4
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    Il y a aussi "protected" comme modificateur qui propose un accès plus large que private, en l'étendant au package. En plaçant treenode dans le meme package que ton "instrospecteur", tu auras l'accès autorisé.
    Et aussi il est vrai que ta méthode de faire est particulièrement peu évidente.

  5. #5
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par broumbroum
    Il y a aussi "protected" comme modificateur qui propose un accès plus large que private, en l'étendant au package. En plaçant treenode dans le meme package que ton "instrospecteur", tu auras l'accès autorisé.
    Je déteste cette façon de faire. J'essaye de mettre au maximum tous mes fields en private.
    Sinon c'est un peu comme si toute ta famille pouvait jouer avec tes attributs. Perso j'aime pas :p
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  6. #6
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Bonjour,
    Mon but est de modifier le moins possible, voir pas du tout, la class TreeNode, ce n'est pas moi qui l'ai écrite, cela vient d'un outils open source.
    Et aussi il est vrai que ta méthode de faire est particulièrement peu évidente
    Que veux tu dire ? Je trouve que l'introspection est un bon moyen non ? Mon code est peut etre maladroit, dans ce cas si qqun peut m'aidé à améliorer le petit bout de code afin d'accéder a ce champs node je suis preneur.
    Merci.

  7. #7
    Membre averti Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Points : 328
    Points
    328
    Par défaut
    Il me semblait qu'on pouvait accéder aux champs privés par la méthode getDeclaredField(monChamp); puis ensuite de gérer l'accessibilité par setAccessible() pour pouvoir le modifier, non ?
    La différence entre la théorie et la pratique est plus mince en théorie qu'en pratique

  8. #8
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Salut à toi et merci sa marche en effet avec ces méthodes.
    ++

  9. #9
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par broumbroum
    Il y a aussi "protected" comme modificateur qui propose un accès plus large que private, en l'étendant au package. En plaçant treenode dans le meme package que ton "instrospecteur", tu auras l'accès autorisé.
    Et aussi il est vrai que ta méthode de faire est particulièrement peu évidente.
    C'est totalement faux:

    protected conceptuellement et dans les derniéres jvm c'est réservé à l'accés dans les sous-classe (dans l'arbre d'héritage) de la classe parente.

    Pour un accés package il faut ne pas utiliser de modificateur, on parle alors d'accés friendly...

    A+

  10. #10
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par thibaut
    protected conceptuellement et dans les derniéres jvm c'est réservé à l'accés dans les sous-classe (dans l'arbre d'héritage) de la classe parente.
    Heu.... Un lien pour confirmer ce que tu dis ? Parce que ça m'étonne pas mal quand même.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    http://java.sun.com/docs/books/tutor...sscontrol.html
    en fait ca justifie rien.. disolé
    ca dit juste protected = package + sous classe
    par contre on peut aussi faire un private protected et apparement dans ce cas c'est que les sous classe qui y ont acces...
    a voir...

  12. #12
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package pck1;
     
    public class Test1 {
        protected String valeur1 = null;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package pck2;
     
    import pck1.Test1;
     
    public class Test2 {
     
        protected String valeur2 = null;
     
        public static void main(String[] args) {
            Test1 test1 = new Test1();
            test1.valeur1 = "3";
        }
    }
    Provoque une erreur de compilation !!!

    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package pck2;
     
    public class Test3 extends Test2 {
     
        public static void main(String[] args) {
            Test2 test2 = new Test2();
            test2.valeur2 = "3";
        }
    }
    fonctionne correctement !!!

    private protected n'existe pas !!!

  13. #13
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Citation Envoyé par lilou77
    par contre on peut aussi faire un private protected et apparement dans ce cas c'est que les sous classe qui y ont acces...
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    lol
    j'ai trouvé ca sur internet http://www.univ-lemans.fr/enseigneme...ava/java4.html recherché private protected

  15. #15
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Note pour plus tard : Ne pas envoyer mes enfants à l'univ de le mans !
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  16. #16
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par lilou77
    lol
    j'ai trouvé ca sur internet http://www.univ-lemans.fr/enseigneme...ava/java4.html recherché private protected
    C'est bien beau tout ça l'université de Le Mans, mais le gars à oublié la visibilité firendly... super le tutorial !

  17. #17
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Ceci dit, j'ai toujours trouvé que ça manquait dans Java un "private protected". ce serait bien :p
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

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

Discussions similaires

  1. [introspection][singleton] introspetion de classe à singleton
    Par Jaxofun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 18/08/2005, 09h59
  2. [débutant(e)][Reflection] Introspection et creation de tableau
    Par Fladnag dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 04/07/2005, 15h59
  3. problème d'introspection sous eclipse
    Par rainz dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/05/2005, 16h33
  4. fonction de tri par introspection
    Par ned-flanders dans le forum C++
    Réponses: 7
    Dernier message: 21/10/2004, 11h49
  5. [JNDI] [LDAP] [DirContext] [LdapContext] DN / introspection
    Par wazup dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/04/2004, 15h16

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