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

API standards et tierces Java Discussion :

Introspection et superclasses


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut Introspection et superclasses
    Bonjour à tous,

    Je suis actuellement confronté à un problème lié à l'utilisation de l'introspection sur des classes-mères.

    J'ai une classe A qui hérite d'une classe B, toutes deux possèdent des attributs. Je créé une instance de la classe A et je souhaite utiliser l'introspection pour récupérer les noms et valeurs des attributs de l'instance créée.

    J'utilise donc le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Class c = Class.forName("A");
    Field[] f = c.getDeclaredFields();
    System.out.println(f[0].get(obj).toString()); // affiche le nom du 1er attribut de la classe A
    Lorsque j'applique la même méthode sur le même objet mais en voulant introspecter sur la classe B, ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Class c = Class.forName("B");
    Field[] f = c.getDeclaredFields();
    System.out.println(f[0].get(obj).toString()); //lève une IllegalArgumentException
    Cependant, dans la Javadoc, il semble possible de récupérer les champs d'une instance d'une classe et de ses classes-mères.

    Savez-vous comment cela se réalise-t-il ?

    Merci d'avance et longue vie à developpez.com !!!

    [ Modéré par SEMPERE Benjamin ]
    Ajout des balises code
    Les Règles du Forum

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Il faut lire la javadoc :
    Citation Envoyé par javadoc
    A propos de la méthode getDeclaredFields

    Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object. This includes public, protected, default (package) access, and private fields,
    Donc, si tu utilises une instance de A (A héritant de B) et que tu tentes d'acceder à un champ private de B, il va y avoir comme un problème. Par contre, tu devrais avoir une IllegalAccessException.

    Rajoute System.out.println(f[0].toString()); avant ton System.out.println(f[0].get(obj).toString());
    Ca te permettra de savoir sur quel champ se situe le problème.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Merci de ta réponse,

    En fait, j'ai fait une bétise dans mon code. Je suis le seul fautif, que la honte s'abatte sur moi

    La méthode get(Object) fonctionne parafaitement, que ce soit sur une classe ou sur ses superclasses.

    Pour ce qui est des champs privés, je fais un setAccessible(true) sur les champs privés afin de pouvoir y accèder, ceci afin d'éviter d'avoir des IllegalAccessException.

    Merci et à bientôt

  4. #4
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    J'ai pas bien compris ? C'était quoi ton erreur ?

  5. #5
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    En fait, mon programme est plus compliqué que les petits bouts de code que j'y ai fait figuré, tu t'en doutes.

    J'ai simplement modifié la référence de l'objet que j'introspectais en cours de route. Mon erreur n'a donc rien à voir avec l'introspection, c'est moi qui me suis planté...

    Bonne journée et à bientôt 8)

  6. #6
    Membre confirmé Avatar de delas
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 100
    Par défaut
    Citation Envoyé par dlemoing
    Il faut lire la javadoc :
    Citation Envoyé par javadoc
    A propos de la méthode getDeclaredFields

    Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object. This includes public, protected, default (package) access, and private fields,
    Donc, si tu utilises une instance de A (A héritant de B) et que tu tentes d'acceder à un champ private de B, il va y avoir comme un problème. Par contre, tu devrais avoir une IllegalAccessException.

    Rajoute System.out.println(f[0].toString()); avant ton System.out.println(f[0].get(obj).toString());
    Ca te permettra de savoir sur quel champ se situe le problème.
    j'ai ce probleme. Je veux acceder aux champs privés d'une superclass. Comment faire alors?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/07/2010, 11h00
  2. problème d'introspection sous eclipse
    Par rainz dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/05/2005, 16h33
  3. fonction de tri par introspection
    Par ned-flanders dans le forum C++
    Réponses: 7
    Dernier message: 21/10/2004, 11h49
  4. [JNDI] [LDAP] [DirContext] [LdapContext] DN / introspection
    Par wazup dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/04/2004, 15h16
  5. [OpenTools, designer] CmtSubComponent et superClasse
    Par kainor dans le forum JBuilder
    Réponses: 4
    Dernier message: 04/03/2003, 11h32

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