Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  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 :
    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 :
    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 963
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 1 963
    Points : 1 909
    Points
    1 909

    Par défaut

    Salut,
    un bout de code qui devrait t'inspirer

    Code :
    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 :
    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 963
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 1 963
    Points : 1 909
    Points
    1 909

    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
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 164
    Points : 34 810
    Points
    34 810

    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 :
    1
    2
    3
    public interface Calcul {
        double calculer(double argument);
    }
    Code :
    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 (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

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

    Informations professionnelles :
    Activité : consultant/formateur Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 892
    Points : 1 125
    Points
    1 125

    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
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 164
    Points : 34 810
    Points
    34 810

    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 :
    Map<String,FonctionMathematique> fonctionsDisponibles
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

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

    Informations professionnelles :
    Activité : consultant/formateur Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 892
    Points : 1 125
    Points
    1 125

    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 :
    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!

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •