Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 29/11/2012, 14h59   #1
Saruyumi
Invité de passage
 
Femme
Etudiante
Inscription : 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 !
Saruyumi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 16h49   #2
Djakisback
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 910
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 910
Points : 1 839
Points : 1 839
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
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 13h45   #3
Saruyumi
Invité de passage
 
Femme
Etudiante
Inscription : 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
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".
Saruyumi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 16h14   #4
Djakisback
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 910
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 910
Points : 1 839
Points : 1 839
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 :

Citation:
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
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 18h39   #5
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 278
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

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

Informations forums :
Inscription : avril 2007
Messages : 18 278
Points : 32 754
Points : 32 754
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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;
    }
});
__________________
⥀⥁ Чиз 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.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 14h01   #6
professeur shadoko
Membre Expert
 
Avatar de professeur shadoko
 
Homme
consultant/formateur Java SE
Inscription : juillet 2006
Messages : 772
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 64
Localisation : Autre

Informations professionnelles :
Activité : consultant/formateur Java SE

Informations forums :
Inscription : juillet 2006
Messages : 772
Points : 1 066
Points : 1 066
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!
professeur shadoko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 16h06   #7
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 278
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

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

Informations forums :
Inscription : avril 2007
Messages : 18 278
Points : 32 754
Points : 32 754
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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
__________________
⥀⥁ Чиз 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.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 16h46   #8
professeur shadoko
Membre Expert
 
Avatar de professeur shadoko
 
Homme
consultant/formateur Java SE
Inscription : juillet 2006
Messages : 772
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 64
Localisation : Autre

Informations professionnelles :
Activité : consultant/formateur Java SE

Informations forums :
Inscription : juillet 2006
Messages : 772
Points : 1 066
Points : 1 066
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!
professeur shadoko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h10.


 
 
 
 
Partenaires

Hébergement Web