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 :

Utilisation de l' introspection


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut Utilisation de l' introspection
    Bonjour,

    Voilà je viens poster ici après avoir jeter un oeil sur les différents tutos que j'ai pu trouver concernant l'introspection en Java.

    En fait je dois réaliser une classe qui permet à l'aide d'une méthode utilisant 2 classes génériques en paramètres de mapper des données entre ces 2 classes suivant ce qui se trouve dans un fichier de configuration.

    Je m'explique, si j'ai dans mon fichier de config:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    attribut à renseigner="NomClasse1.Att1" valeur à attribuer="NomClasse2.Att2"
    Je dois à l'aide ma classe de mapping chercher la classe NomClasse1 et son Att1 pour lui mettre la valeur Att2 de la classe Att2, tout çà à partir des classes génériques (qui sont en fait des interfaces dont mes classes de données hérites)

    Actuellement, je n'ai pas trop d'idée pour commencer cette classe, alors plusieurs questions me viennent:

    1) Est-ce possible de le faire déja?
    2) Si oui, est-ce bien l'introspection qui me le permettra?

    De plus, je sais que j'en demande bcp mais si vous aviez un tuto interessant qui m'aurait échappé ou un bout de code pour commencer, je vous en serait très reconnaissant.

    Voila j'espère avoir été clair.

    Merci d'avance!

  2. #2
    Membre confirmé Avatar de arnobase
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Par défaut
    Salut !

    Je ne connais pas vraiment l'introspection, c'est juste une notion dont j'ai entendu parler (ou lu écrire ? notons comme celà parait étrange alors qu'il s'agit de la transcription dans le mode scriptural de cette expression exclusivement teintée d'usage oratoire... hum ... bref)

    C'est je crois un moyen d'aller creuser dans une classe pour en extraire les informations intrinseques ? ses methodes, ses types de données ? (arretez moi si je me trompe )

    Je crois que je n'ai pas bien compris ce que tu voulais faire, pourquoi l'accès à tes attributs via des getters ne sont-ils pas suffisants ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Salut à toi!

    Bon alors oui l'introspection permet entre autre de faire ce que tu dis, du moins c'est ce que j'en ai compris, tout comme toi j'ai jamais pratiqué, pour moi ça reste de la pure théorie!

    En fait, le "problème" que j'ai, c'est que je ne connais pas a priori les classes sur lesquelles je vais devoir travailler puisque je travaille sur mes classes génériques...donc la le seul moyen que j'ai, c'est de découvrir dynamiquement de quoi est composé la classe en question et d'aller travailler sur l'attribut désigné dans mon fichier de config...

    Encore une fois, c'est comme ça que je vois mon problème, mais je ne suis sur de rien, d'où mes questions existantielles!:-)

  4. #4
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Même si ce n'est pas bien compliquer à faire. Cela peut s'averer utile de d'abord évaluer des librairies pour faire ce genre de trucs. Cela t'evites de constamment réinventer la roue et ca permet de se concentrer sur le métier. un framework connu pour faire du bean2bean mapping est Dozen : http://dozer.sourceforge.net/documen...ngstarted.html.

    Sinon voici un petit bout de code pour commencer qui extrait toutes les méthodes d'une classe quelque soit sa hierarchie. Tu peux faire la même chose avec les fields dirctement même si je pense que c'est mieux de respecter la convention javabean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            Method[] temp = this.getClass().getMethods();
            String name;
            Class[] paramTypes;
            for (int i = 0; i < temp.length; i++) {
                //Name of the method
                name = temp[i].getName();
     
            }

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Oui, c'est tout à fait possible avec l'introspection, il suffira d'assembler le nom de la méthode set et get des deux classes et ensuite avec l'introspection d'appeller ces deux méthodes.

    Je te conseille cet article : http://ricky81.developpez.com/tutori...pi/reflection/

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Ok merci pour ces infos, je creuse dans ce sens et je reviens vers vous si ça coince!

    Bonne journée!

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Par défaut
    Citation Envoyé par arnobase
    Salut !

    Je ne connais pas vraiment l'introspection, c'est juste une notion dont j'ai entendu parler (ou lu écrire ? notons comme celà parait étrange alors qu'il s'agit de la transcription dans le mode scriptural de cette expression exclusivement teintée d'usage oratoire... hum ... bref)

    C'est je crois un moyen d'aller creuser dans une classe pour en extraire les informations intrinseques ? ses methodes, ses types de données ? (arretez moi si je me trompe )

    Je crois que je n'ai pas bien compris ce que tu voulais faire, pourquoi l'accès à tes attributs via des getters ne sont-ils pas suffisants ?
    un exemple d'utilisation :
    tu as un fichier XML en entrée décrivant les caractéristiques d'une voiture
    tu souhaites avoir en sortie un objet java Voiture contenant toutes les infos du fichier XML
    => tu parses le fichier, et grace à un fichier de properties par exemple tu mappes chaque tag XML rencontré avec la méthode setter à appeler pour mettre à jour l'attribut correspondant de ton objet Voiture.

    Pour faire cela, t'as besoin de l'instrospection, et tu appelles le setter qu'il faut avec la méthode donnée par zekey

    +++

  8. #8
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    Citation Envoyé par zekey
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            Method[] temp = this.getClass().getMethods();
            String name;
            Class[] paramTypes;
            for (int i = 0; i < temp.length; i++) {
                //Name of the method
                name = temp[i].getName();
     
            }
    Je déborde peut être un peu mais je voudrais revenir sur ce code. Ne vaudrait-il pas mieux déclarer un tableau de String pour récupérer tous les noms de méthodes de la classe ?

    De plus, j'ai encore un peu de mal avec l'introspection malgré de nombreux tutoriaux et surtout celui de ricky81 qui est pourtant très détaillé

  9. #9
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Citation Envoyé par sironimo
    Je déborde peut être un peu mais je voudrais revenir sur ce code. Ne vaudrait-il pas mieux déclarer un tableau de String pour récupérer tous les noms de méthodes de la classe ?

    De plus, j'ai encore un peu de mal avec l'introspection malgré de nombreux tutoriaux et surtout celui de ricky81 qui est pourtant très détaillé
    C'est juste un exemple, pas un algo. Cependant je ne pense pas qu'un tableau de String soit une bonne approche, mieux vaut directement utilisé le type Method et mettre dans une liste (pour le caching par exemple) même si il y a un inconvénient de taille Method et Field ne sont pas Serializable <-- interdiction d'avoir le début du sentiment de l'intuition de l'idée ne me mettre cette bestiole dans une HTTPSession.

  10. #10
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    Ok merci pour les précisions et ne t'inquiètes pas cela ne m'avait même pas effleurer l'esprit

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Salut tout le monde,

    désolé je fais remonter le topic mais en fait je n'ai pas pu trop avancer depuis la dernière fois!

    Toutefois, une question me turlupine la: l'utilisation de getMethods() (notamment le bout de code de zekey) permet d'avoir les méthodes définies dans la classe et dans ses classes supérieures mais pour ce qui est des classes filles, qu'en est-il?

    S'il n'y a pas moyen de retrouver ces méthodes, je pensais à caster mes objets mais est-ce la solution?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Excusez moi encre une fois mais je fai remonter le topic parce que je ne trouve pas la solution...Apparement, l'introspection ne permet pas de faire ça, mais comment alors? Su quelqu'un a une piste, ça serait super sympa!

    Merci d'avance!

  13. #13
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par kobe
    Apparement, l'introspection ne permet pas de faire ça, mais comment alors? Su quelqu'un a une piste, ça serait super sympa!
    Tu veux faire quoi exactement ? Ce n'est pas très clair...

    Donne nous un exemple précis...

    a++

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Tout est détaillé dans le post initial mais je donne un exemple concret...

    Admettons que mon fichier de config comporte ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attribut à renseigner="NomClasse1.Att1" 
    valeur à attribuer="NomClasse2.Att2"
    Je dois donc réaliser une classe qui me permette avec une méthode Map de mettre la valeur de Att2 pour Att1. Pour se faire, je voudrais en paramétre de cette méthode 2 objets de type "GenericData" admettons, interface qui serait implémenté par la NomClasse1 et NomClasse2.

    Donc, de ce fait, je n'ai que le type "GenericData" (qui ne contient rien) et je dois trouver les méthodes set et get des classes filles concernées pour prendre et renseigner la valeur.

    J'espère que je me suis bien exprimé, merci pour l'aide.

  15. #15
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kobe
    Tout est détaillé dans le post initial mais je donne un exemple concret...
    Ben justement la solution a été donné ! C'est tout à fait possible avec l'introspection (et au passage on peut utiliser directement la classe Introspector si tu respectes bien les conventions de nommage Java).

    Je ne vois pas le problème...

    a++

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Citation Envoyé par adiGuba
    Ben justement la solution a été donné ! C'est tout à fait possible avec l'introspection (et au passage on peut utiliser directement la classe Introspector si tu respectes bien les conventions de nommage Java).

    Je ne vois pas le problème...

    a++
    Et bien en fait, je suis surement bête mais pour avoir testé getMethods() par exemple, si je le fais dans ma classe "GenericData", je vais obtenir les méthodes écrites dans cette classe et celle qui sont hérités mais si je désire avoir les méthodes des classes filles justement, c'est impossible comme ça non?

  17. #17
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Ben getClass() te renvoi une référence vers le vrai type de l'objet. Donc si le vrai type n'est pas GenericData mais une classe fille, cela te renverra le type de la classe fille...

    a++

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    Ahhh ok...décidément l'introspection est une notion qui me résiste...bon je m'avance dans ma classe de mapping voir ce que j'arrive à faire!

    Merci!

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    C'est encore moi!

    Voila j'ai avancé et pour mes tests, j'essaye à partir de mon fichier de config donc, de créer 2 obj de classes identiques et de prendre la valeur d'un attribut dans une des classes pour la mettre sur un autre attribut dans l'autre classe.

    Voila un extrait du code:

    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
     try {
            inJavaClass=Class.forName(inClass);
            inMethod=getGetter(inJavaClass,inAttribut);
     
            inReturn[0]=inMethod.invoke(inJavaClass.newInstance(),null);
            } catch ( Exception e) {  
    		              e.printStackTrace();}
          } 
     
     
     
            try {
     
            outJavaClass=Class.forName(outClass);
            outMethod=getSetter(outJavaClass,outAttribut);
     
            //Affichage de l'ancienne valeur avec le get
            result=(String)getGetter(outJavaClass,outAttribut).invoke(outJavaClass.newInstance(),null);
     
            outMethod.invoke(outJavaClass.newInstance(),inReturn);
     
            //Affichage de la nouvelle valeur avec le get
            result=(String)getGetter(outJavaClass,outAttribut).invoke(outJavaClass.newInstance(),null);
            } catch ( Exception e) {  
    		              e.printStackTrace();}
    J'utilise donc les méthodes get et set de ces classes

    Le problème vient de ma méthode "invoke" puisque si je n'ai pas d'erreur à la compil ou a l'exe, quand je réaffiche la valeur après l'appel au Set, la valeur n'est pas changée...

    Je me demande si j'ai bien compris ce que la méthode attends en 2ème paramétre, ma variable "inReturn" étant un tableau d'obejt contenant le String résultant de l'appel au Get

    Merci d'avance pour votre aide

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Par défaut
    C'est bon j'ai trouvé! Cela est du a mon newInstance() qui faisait que je ne travaillais plus sur le meme objet, forcément...bête mais j'ai mis du temps a trouver...

    A présent, j'ai une autre ptite question (qui je l'espère aura plus de succès):

    pour ce qui est des types String et Integer, ça devrait coller, mais je peux avoir dans mon fichier de config, un nom de classe pour mettre dans ma classe de destination. De ce fait, comment faire pour obtenir à partir de ma chaine récupérée dans le fichier une classe du type voulu?

Discussions similaires

  1. Passer un champ à null en utilisant l'introspection
    Par jeanvalery dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 18/09/2007, 16h13
  2. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  3. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  4. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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