p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Invité de passage
    Femme Profil pro
    Etudiante
    Inscrit en
    novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : novembre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Introspection et invoke method

    Bonjour,

    (je suis nouvelle sur le forum, j'espère ne pas avoir créé n'importe quoi n'importe où..)

    Alors voilà, je suis entrain de faire une calculette comportant plusieurs boutons correspondant aux fonctions de la classe Math.
    Mon problème c'est au niveau de l'appel dynamique de la fonction (du bouton) choisie.
    J'ai un ActionListener sur mes boutons, et donc une fonction actionPerformed pour écouter/déclencher tout ça, là voici :

    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
    public void actionPerformed(ActionEvent e) {
     
    				JButton boutonClic = (JButton)e.getSource();
    				Class c = this.getClass();
    				System.out.println(boutonClic.getText()); //affiche le nom de la methode (du bouton)
    				System.out.println(c.getName()); //affiche la classe
     
    					  try {
    						Class [] param = c.getClass().getMethod(boutonClic.getText()).getParameterTypes();
    						calculer(c, param, boutonClic.getText());
    					} catch (SecurityException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					} catch (NoSuchMethodException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					}
    			}
    Puis ma fonction calculer :

    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
    public void calculer(Class c, Class[] args, String nomMethode){
    				Class[] paramTypes = null;
    				if(args != null){
    				    paramTypes = new Class[args.length];
    				    for(int i=0;i<args.length;++i){
    				      paramTypes[i] = args[i].getClass();
    				    }
    				}
    				Method m;
    				try {
    					m = c.getClass().getMethod(nomMethode,paramTypes);
    					Double val = new Double(this.valeur.getText());
    					System.out.println(val);
    					Double result = (Double)m.invoke(c,args);
    				} catch (SecurityException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (NoSuchMethodException e) { 
    					System.out.println("No such Method");
    				} catch (IllegalArgumentException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    			}

    Bon, alors ça marche pas du tout, j'ai surtout et toujours l'erreur NoSuchMethod, malgré tout ce que j'ai lu et essayé.. rien à faire, je bloque !

    Je sais qu'il faut que j'arrive à récupérer (pour mon invoke) : une classe (je sais pas la quelle), un tableau avec les types des arguments de la methode et le nom de ma methode.

    Je dois peut être préciser que les fonctions (boutons) ne retourne que des doubles et n'ont qu'un seul argument...

    Si vous avez des conseils ils seront les bienvenues, biensûr je suis pas une pro alors si vous pouvez être assez simples dans vos explications
    Merci d'avance !

  2. #2
    Membre Expert Avatar de Djakisback
    Inscrit en
    février 2005
    Messages
    1 994
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 1 994
    Points : 2 150
    Points
    2 150

    Par défaut

    Salut,
    un bout de code qui devrait t'inspirer

    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
    	try {
    			Class math = Class.forName("java.lang.Math");
    			Method m = math.getMethod("round", double.class);
    			System.out.println(m.invoke(null, 12.125));
    		}
    		catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Attention il y a une différence entre "double.class" et "Double.class", c'est peut-être ton erreur.
    Vive les roues en pierre

  3. #3
    Invité de passage
    Femme Profil pro
    Etudiante
    Inscrit en
    novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : novembre 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Un peu 30 ans apres... je n'y travaille pas tous les jours dessus...

    Merci pour ton exemple "Djakisback", je m'en suis inspirée pour reprendre un peu tout à zéro, j'ai plus une tonne d'erreurs, mais c'est toujours no such method...

    J'ai du mal à comprendre comment savoir quelle est la classe qui utilise invoke, là j'ai fais avec Math du coup, mais je sais pas pourquoi c'est elle.

    Sinon ma fonction calculer est devenu ceci :
    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
    public void calculer(Class c, String nomMethode){
    				try {
    					Method m = c.getMethod(nomMethode, Double.class);
    					Double val = new Double(this.valeur.getText());
    					System.out.println(val);
    					Double result = (Double)m.invoke(null,val);
    				} catch (SecurityException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (NoSuchMethodException e) { //quand la methode n'existe pas
    					System.out.println("No such Method");
    				} catch (IllegalArgumentException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    			}
    Je sais aussi que mes fonctions de Math ne retournent que des "double", et pas des "Double".

  4. #4
    Membre Expert Avatar de Djakisback
    Inscrit en
    février 2005
    Messages
    1 994
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 1 994
    Points : 2 150
    Points
    2 150

    Par défaut

    Salut,
    je ne comprends pas bien ce que tu veux dire par rapport au fait de connaître la classe et pas rapport à la classe Math :

    Alors voilà, je suis entrain de faire une calculette comportant plusieurs boutons correspondant aux fonctions de la classe Math.
    Je pensais que tu voulais pouvoir invoquer dynamiquement les méthodes de la classe Math (http://docs.oracle.com/javase/6/docs...lang/Math.html) à partir de Strings, est-ce que ce n'est pas cela ?
    Un String pour le nom de la méthode et des Strings pour les différents arguments ?
    Vive les roues en pierre

  5. #5
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 811
    Points : 43 304
    Points
    43 304

    Par défaut

    Hou là, je dois avouer, l'utilisation de l'introspection pour appeler les méthodes de Math, c'est une première

    Y a-t-il un raison particulière pour agir comme cela? Parce que ça n'a pas de raison d'être. Met simplement un action listener différent sur chaque bouton Un sinus, ce n'est pas une tangente, il n'y a pas de raison que l'action soit la même .

    tu peux centraliser une partie de ton code pour factoriser, mais l'introspection, c'est du n'importe nawak

    Allez, un exemple basique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Calcul {
        double calculer(double argument);
    }
    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
    public JButton creerBouton(String name, final Calcul calcul){
       ActionListener action = new ActionListener(){
          @Override
          public void actionPerformed(ActionEvent e){
              Double val = new Double(this.valeur.getText());
              System.out.println(val);
              Double result = calcul.calculer(val);
              // faire un truc avec le résultat?
          }
       }
       JButton bouton = new JButton(name);
       bouton.addActionListener(action);
    }
     
    // et l'utilisation
     
    JBouton boutonRacineCarree = creerBouton("sqrt", new Calcul(){
        @Override
        public double calculer(double argument){ return Math.sqrt(argument);}
    });
     
    JBouton boutonSinus = creerBouton("sinus", new Calcul(){
        @Override
        public double calculer(double argument){ return Math.sin(argument);}
    });
     
    JBouton BoutonDemi= creerBouton("demi", new Calcul(){
        @Override
        public double calculer(double argument){ 
            System.out.println("Uuuun demii de biiiièère ppppaatron!");
            return argument/2.0;
        }
    });
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    consultant/formateur Java SE
    Inscrit en
    juillet 2006
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Autre

    Informations professionnelles :
    Activité : consultant/formateur Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 978
    Points : 1 352
    Points
    1 352

    Par défaut

    Citation Envoyé par tchize_ Voir le message
    Hou là, je dois avouer, l'utilisation de l'introspection pour appeler les méthodes de Math, c'est une première
    pas tout à fait: j'ai fait faire ça à mes élèves pour un évaluateur d'expressions.
    décomposition de la chaîne de caractères , on trouve le nom d'une fonction math et on l'invoque dans Math ...
    Mais pour sür c'est pas le même problème .....
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!

  7. #7
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 811
    Points : 43 304
    Points
    43 304

    Par défaut

    Citation Envoyé par professeur shadoko Voir le message
    décomposition de la chaîne de caractères , on trouve le nom d'une fonction math et on l'invoque dans Math ...
    Sauf si le but était de leur faire apprendre l'api reflect, me semble quand même que ce genre de problème est plus facile à résoudre avec un turc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String,FonctionMathematique> fonctionsDisponibles
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  8. #8
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    consultant/formateur Java SE
    Inscrit en
    juillet 2006
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Autre

    Informations professionnelles :
    Activité : consultant/formateur Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 978
    Points : 1 352
    Points
    1 352

    Par défaut

    Citation Envoyé par tchize_ Voir le message
    Sauf si le but était de leur faire apprendre l'api reflect, me semble quand même que ce genre de problème est plus facile à résoudre avec un turc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String,FonctionMathematique> fonctionsDisponibles
    yep
    maizodebu on fait le tour des Methods dispo par introspection
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!

Discussions similaires

  1. [introspection] Fields et Methods
    Par mezoo dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2011, 16h10
  2. Réponses: 0
    Dernier message: 08/10/2009, 10h08
  3. jsf spring hibernate invoke methode
    Par rasmusin dans le forum JSF
    Réponses: 3
    Dernier message: 17/04/2008, 09h01
  4. pb d'invoke de methode avec un tableau d'objets en parametre
    Par sebastien2222 dans le forum Langage
    Réponses: 11
    Dernier message: 27/09/2006, 10h33
  5. Réponses: 3
    Dernier message: 12/07/2006, 11h35

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