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 :

Reflection - getReadMethod


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Par défaut Reflection - getReadMethod
    Bonjour à tous
    Voila mon problème:
    J'ai une classe Data.java comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package test.thom;
     
    public class Data {
    	public String dataNumber1 ="";
            public String getDataNumber1() {
    		return dataNumber1;
    	}
    	public void setDataNumber1(String dataNumber1) {
    		dataNumber1 = dataNumber1;
    	}
    Dans ma classe principale voila ce que j'execute tout simplement:
    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
     
    public void read(Data dt){
    	        Class classe = Class.forName(Data.class.getName());
    	        Field[] champs = classe.getDeclaredFields();
    	        Constructor ctxConstructor = classe.getConstructor();
    	        Object ctx = ctxConstructor.newInstance();
    	        BeanInfo bi = Introspector.getBeanInfo(classe);
    	        PropertyDescriptor[] propertyDescriptor = bi.getPropertyDescriptors();
    	        int nbFields=champs.length;
    	        for(int i=0;i<nbFields;i++){//1 seul dans mon exemple mais en vrai bcp plus d'ou la boucle for
    System.out.println((String)propertyDescriptor[i].getReadMethod().invoke(ctx));
    	        }
    }
     
    public static void main(String[] args) {
    		Data dm = new Data();
    		dm.setDataNumber1("Hello World");
    		test.read(dm)
    	}
    Or en sortie je n'ai rien comme résultat (soit "" la chaine d'init de ma variable dataNumber1)
    Auriez vous des idées?

    Merci d'avance,

    Cdt

    Thomas

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    en même temps tu lit les valeur d'un instance que tu viens de crée (ctx) ça irais mieux si tu lisait les valeur de dt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void read(Data dt){
    	        Class classe = dt.getClass();
    	        BeanInfo bi = Introspector.getBeanInfo(classe);
    	        PropertyDescriptor[] propertyDescriptor = bi.getPropertyDescriptors();
    	        int nbFields=propertyDescriptor.length;
    	        for(int i=0;i<nbFields;i++){//1 seul dans mon exemple mais en vrai bcp plus d'ou la boucle for
    System.out.println((String)propertyDescriptor[i].getReadMethod().invoke(dt));
    	        }
    }

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Par défaut
    Bonjour,

    Est ce que ton code est vraiment le code de la classe, parce que là ça ne devrait pas compiler, il manque les gestion des exceptions, et quelques autres erreurs.

    En admettant que ton code réel ne soit pas exactement celui là, je vois deux soucis principaux:

    Tu invoques les méthodes sur un objet que tu as créé à partir d'un "newInstance", en gros un objet "vide", mais pas celui que tu as passé en paramètre, fait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println((String)propertyDescriptor[i].getReadMethod().invoke(dt));
    De plus, la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < nbFields; i++)
    Tu parcours la boucle autant de fois qu'il y a de champs dans ta classe, en réalité il faut la parcourir autant de fois qu'il y a de méthode (il y a plus de méthodes que de champ -> au minimum la méthode 'getClass').

    a+

  4. #4
    Membre averti
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Par défaut
    Merci pour ces réponses, effectivement c'est un bout de code et il manque tous les throws etc mais le principal est la.
    Concernant le nb de fields et/ou de méthodes, a vrai dire la classe data ne contient qu'une liste de champs et les getter et setter associé c'est tout.
    Donc ca marche en changeant ctx par dt merci, cependant maintenant le problème est un peu plus étrange...
    En fait ma classe Data se présente sous cette forme:
    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
    28
    29
    30
    31
    32
    33
    34
    35
     
    package test.thom;
     
    public class Data {
    	public String dataNumber1 ="";
            public String dataNumber2 ="";
            public String dataNumber3 ="";
            public String dataNumber4 =""; //jusqu'à environ 100
     
            public String getDataNumber1() {
    		return dataNumber1;
    	}
    	public void setDataNumber1(String dataNumber1) {
    		dataNumber1 = dataNumber1;
    	}
     
            public String getDataNumber2() {
    		return dataNumber2;
    	}
    	public void setDataNumber2(String dataNumber2) {
    		dataNumber2 = dataNumber2;
    	}
            public String getDataNumber3() {
    		return dataNumber3;
    	}
    	public void setDataNumber3(String dataNumber3) {
    		dataNumber3 = dataNumber3;
    	}
            public String getDataNumber4() {
    		return dataNumber1;
    	}
    	public void setDataNumber4(String dataNumber4) {
    		dataNumber4 = dataNumber4;
    	}
           //etc jusqu'à 100
    Et lorsque je log dans ma boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	        for(int i=0;i<nbFields;i++){
    System.out.println("Data = " + champs[i].getName() + " et value = " + (String)propertyDescriptor[i].getReadMethod().invoke(dt)););
    	        }
    }
    Je vois:
    Data = dataNumber1 et value =
    Data = dataNumber2 et value =
    Data = dataNumber3 et value =
    Data = dataNumber4 et value =
    ....
    Data = dataNumber90 et value =Hello World

    Alors que dans mon main je set "Hello World" sur la DataNumber1, c'est vraiment bizarre...
    Merci pour votre aide,

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il y avait déjà la même erreur dans ton premier programme, mais tu nous dis que tu l'as corrigé. Je n'y crois pas, fais voir le code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par ThomasParis Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public void setDataNumber1(String dataNumber1) {
    		dataNumber1 = dataNumber1;
    	}
    Il s'agit probablement d'une erreur de copier-coller, mais là ton setter ne fait rien...

    Citation Envoyé par ThomasParis Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Data = " + champs[i].getName() + " et value = " + propertyDescriptor[i].getReadMethod().invoke(data));
    Tu affiches une valeur liée à champs[i] et une valeur liée à propertyDescriptor[i], or les tableaux champs et propertyDescriptor n'ont pas grand chose à voir, les valeurs qu'ils contiennent ne sont pas censées correspondre deux à deux...

  7. #7
    Membre averti
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Par défaut
    Effectivement ca marche mieux, merci bcp de cotre aide
    Thomas

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

Discussions similaires

  1. [Reflection] Probleme d'appel newInstance()
    Par SEMPERE Benjamin dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/06/2004, 13h15
  2. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35
  3. [Reflection]Probleme d'InstantiationException
    Par guipom dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 23/05/2004, 23h28
  4. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07
  5. Reflections
    Par Laurent Gomila dans le forum DirectX
    Réponses: 4
    Dernier message: 25/07/2003, 14h42

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