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: recuperer l'instance d'un objet


Sujet :

API standards et tierces Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 42
    Par défaut Introspection: recuperer l'instance d'un objet
    Bonjours,

    J'ai un problème avec l'API introspection: je cherche à récupérer l'instance d'un objet (et je n'y arrive pas).

    Je m'explique:

    J'ai a l'instance d'une classe A:
    A a=(A)...

    Cet objet tient (entre autre) un objet b, instance de B en attribut privé

    Je cherche à récupérer b par introspection pour le passer en argument d'une méthode (récupérée elle aussi par introspection):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Method methode; //deja initialisé
        Object obj2; //idem
        List fieldsList = Arrays.asList(a.getClass().getDeclaredFields());
        Iterator itFieldsList = fieldsList.iterator();
        while (itFieldsList.hasNext()) {//parcours de la liste des attributs
                    Field field = (Field) itFieldsList.next();
                    Object[] obj = {field};
                    try {
                          methode.invoque(obj2,obj);
                    } catch (IllegalArgumentException e2) {
                          e2.printStackTrace();
                    }
        }
    Je récupère IllegalArgumentException car obj ne contient pas b.

    Comment m'en sortir ? Dois-je récupérer b par ses accesseurs ?

    Eric LLUSCA

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    getDeclaredFields te renvoi les attributs de la classe tels qu'ils sont déclarés, pas leur valeur.
    Une fois que tu as récupéré l'attribut, il faut utiliser la méthode de Field : get pour avoir sa valeur.

    Pourquoi abuser de l'introspection et ne pas mettre un accesseur sur cet attribut dans la classe A?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 42
    Par défaut
    Merci beaucoup, j'avais mal intégré cet aspect de l'introspection.
    J'aurais du mieux lire http://ricky81.developpez.com/tutori...pi/reflection/

    Sinon, j'ai un accesseur à b dans a MAIS je veux parcourir tous les champs de a sans avoir à les nommer: le jours ou je décide de faire évoluer la classe A et qu'elle tienne aussi c, je ne veux pas avoir a réécrire cette partie de code, je veux accéder aussi a c.

    Je sais que ce n'est pas très clair. C'est lié à des pooler d'objets a b et c.
    Si je rend a alors je dois rendre aussi b.
    Donc le jours ou je ferais évoluer a et qu'il tiendra c, je voudrais ne pas avoir à me casser la tête au niveau du pooler a, il devra rendre c automatiquement, d'où l'accès automatique.

    Je ne trouvais pas mon bonheur avec le pool d'apache.
    En tout cas, ça répond à ma question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Method methode; //deja initialisé
        Object obj2; //idem
        Field[] field = a.getClass().getDeclaredFields();
     
        for (int i=0;i<field.length;i++) {//parcours de la liste des attributs
                    field[i].setAccessible(true);
                    Object[] obj = {field[i].get((Object) a)};
                    try {
                          methode.invoque(obj2,obj);
                    } catch (IllegalArgumentException e2) {
                          e2.printStackTrace();
                    }
        }

  4. #4
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    J'ai déjà été confronté à ce genre de problème, et ce que je fais en général c'est créé une liste d'éléments générique, genre une ArrayList<Parametres>, ou ArrayList<Composants>. Ainsi tu as juste à faire un parcours de ta liste et le code fonctionnera, peu importe le nombre d'éléments dans la liste. C'est beaucoup plus léger que l'introspection.

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

Discussions similaires

  1. [Introspection] Dumper une instance d'objet VB6 en XML
    Par MacReiben dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 25/03/2009, 10h46
  2. [C++] recuperer la classe d'un objet
    Par erwan.bodere dans le forum C++
    Réponses: 2
    Dernier message: 30/11/2005, 10h14
  3. Sauver l'instance d'un objet dans un TMemoryStream
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 11/09/2005, 09h23
  4. [ORACLE 9i] Recuperer le DDL d'un objet
    Par SubZero2 dans le forum Oracle
    Réponses: 25
    Dernier message: 09/04/2005, 00h33
  5. [Stratégie] Récupérer une instance existante
    Par cmoulin dans le forum Général Java
    Réponses: 14
    Dernier message: 11/05/2004, 15h48

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