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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    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 éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    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()

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

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    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 chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    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 éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    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

  6. #6
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    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 expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    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 ?

  8. #8
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    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+

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

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    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.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    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...

  11. #11
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    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 !!!

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

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    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...

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

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

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

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Note pour plus tard : Ne pas envoyer mes enfants à l'univ de le mans !

  15. #15
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    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 !

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

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Ceci dit, j'ai toujours trouvé que ça manquait dans Java un "private protected". ce serait bien :p

+ 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