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

avec Java Discussion :

Du mauvais usage de Reflection


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Du mauvais usage de Reflection
    Bonjour tout le monde,

    Voulant appliquer mes connaissances nouvellement acquises en Java (reflection), j'ai voulu créé une classe qui contient principalement une méthode qui lit le fichier XML (DOM) et qui pour créer des objets qui seront utilisés par la suite à créer une arborescence graphique.

    Tout s'est bien passée, la lecture du fichier XML, le passage du nom de la classe à construire en paramètre, l'instanciation des nouveaux objets, le hic commence lorsque je veux affecter des valeurs aux attributs des objets créés. Des exceptions se manifestent dès que j'essaie de donner une valeur au "Field" de l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fieldlist[k].set(fieldlist[k], treeItem.item(i).getChildNodes().item(k).getTextContent());
    L'exception génère le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Can not set java.lang.String field com.oxxo.entities.TreeNode.code to java.lang.reflect.Field
    L'attribut code en question est un String.

    J'ai pensé à utiliser les méthodes Set des attributs (dans ce cas setCode(String code)) de l'objet mais je me heurte au fait que je ne trouve pas de façon intelligente pour modifier le type de données reçu de XML pour qu'il soit conforme au type de paramètre de la méthode Set.

    Des idées?

  2. #2
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    tu peut essayer avec getDeclaredField et setAccessible(si ton problème vient de l'encapsulation).

    Je tiens cependant à signaler que c'est une mauvaise pratique extrême.

    Bon cette pratique est celle utilisé par l'injection (couplé avec de l'AOP en java), mais ca en est pas moins qu'une pratiquent violant l'un des trois paradigme objet -> l'encapsulation.

    Plus sérieusement, pour ta réponse, il y a hibernate, toplink ,et d'autres ORM qui font tout ceci très bien Au pire si tu veux comprendre mieux, les sources sont toujours accessibles.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse!

    J'aurais du penser au code source des ORM, mais sachant que je poste dans le forum "débuter", il me faudra un bon bout de temps pour interpréter ce que je verrais.

    Mais c'est tout de même mieux que de se livrer à des pratiques extrêmes (comme l'encapsulation) ou de commettre un viol (le pauvre paradigme!)

    Résolu,

    Merci beaucoup!

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Si tu t'affronte à des difficultés n'hésite pas à nous poser des questions, même sur de la compréhension de code, c'est enrichissant pour tous
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    En effet, le code n'est pas si facile à interpréter.

    Je ne trouve pas vraiment la portion qui à partir de données XML, réalise l'instanciation des objets.
    Je croyais que le package java.lang.reflect était suffisant mais je vois qu'on utilise ObjectFactory de javax.spi et je me demande si je ne fais pas fausse route.

    Est-ce que ObjectFactory est utilisé à des fins de création dynamique des objets?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Mon problème est partiellement résolu. J'ai une méthode qui a les paramètre suivants:
    - Nom du fichier XML
    - Le noeud à transformer en objet
    - La classe à instancier pour faire des objets conformes aux noeuds

    Cette méthode fonctionne et me rend une List qui contient les objets. Le problème maintenant c'est que j'ai besoin de trier mes objets, sauf que, même si ceux-ci implémentent Comparable, je suis incapable d'évoquer Collection.sort(List) parce que la liste qui les contient est une liste d'objets List<Object>.

    Quelqu'un a une idée, ou bien aimerait voir le code pour comprendre plus le problème?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    reconstruit une autre List<Comparable> à partir de ta List<Object> après tu appelle sort sur cette nouvelle liste

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 46
    Points : 38
    Points
    38
    Par défaut
    Merci pour ta réponse,

    Est-ce que tu pourrais m'expliquer comment faire ça?
    De mon coté j'ai essayé de faire un Cast des objets mais ça ne marche pas. Ma classe implémente Comparable mais lors du débogage j'ai testé pour voir quelles sont les interfaces implémentées avec Class.getInterfaces(MaClasseConstruiteParReflexion) et la liste retournée est une liste vide, donc impossibler de faire le cast.

    Merci pour ton aide

Discussions similaires

  1. [A-03] Mauvais usage Me! dans Module MergeIt
    Par emye3 dans le forum IHM
    Réponses: 31
    Dernier message: 29/10/2008, 14h15
  2. Reflections
    Par Laurent Gomila dans le forum DirectX
    Réponses: 4
    Dernier message: 25/07/2003, 14h42
  3. mauvais code
    Par moumou dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 17/04/2003, 15h56

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