Salut,
Nouveau en Java, je voudrais savoir s'il y a une solution technique pour appeler une méthode d'une classe en connaissant son nom sous forme de "String".
Merci de votre aide.
Version imprimable
Salut,
Nouveau en Java, je voudrais savoir s'il y a une solution technique pour appeler une méthode d'une classe en connaissant son nom sous forme de "String".
Merci de votre aide.
A ma connaissance ca n'éxiste pas.
Si jamais ca existe je suis preneur!!!
Salut tnarol,
Une solution à ton probleme serait par exemple d'utiliser switch ou des if:
Après cela depend de çe que tu veux vraiment!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public static final int METHODE1=0; public static final int METHODE2=1; .... gererMethodes(int meth){ switch(meth){ case METHODE1:methode1();break; case METHODE2:methode2();break; default:... } }
VIVE LA "REFLECTION" !
;)Code:
1
2
3
4
5
6
7
8
9
10
11
12 // instancier un objet de la classe cible String monNom1 = "monpackage.MaClasse" Class maClasse = Class.forName(monNom1); MaClasse monObjet = (MaClasse) maClasse.newInstance(); // recuperer la methode cible de cette classe String monNom2 = "maMethode"; Class[] mesTypesDeParametre = new Class[] {Integer.class,Boolean.class}; Method maMethode = maClasse.getMethod(monNom2,mesTypesDeParametre); // appeler cette methode sur cette instance Object[] mesValeursDeParametre = new Object[] {new Integer(9),Boolean.FALSE}; Double monResultat = (Double)maMethode.invoke(monObject,mesValeursDeParametre);
+1 ;)Citation:
Envoyé par g_rare
Et pour plus de détail : Introspection en JAVA, présentation de l'API Reflection
a++
Bien sûr le but est d'éviter celà...Citation:
Envoyé par iutcien
Super c'est exactement ça. Merci.Citation:
Envoyé par g_rare
Si aucune méthode ne correspond je suppose que ça donne "maMethode == null" ????Citation:
Envoyé par g_rare
VIVE LA JAVADOC !
;)Citation:
Throws:
NoSuchMethodException - if a matching method is not found or if the name is "<init>"or "<clinit>".
Attention tout de même à la visibilité de la méthode...
Si elle n'est pas public, ça va coincer... (faut voir setAccessible())
Sinon, tu peux utiliser getDeclaredMethods(), mais là, tu n'as pas accès aux méthodes héritées...
Citation:
Envoyé par g_rare
OK donc si je veux ne rien faire si la méthode échoue je peux faire ça :
Code:
1
2
3
4
5
6
7
8
9 try { Method maMethode = maClasse.getMethod(monNom2,mesTypesDeParametre); } catch (Exception e) { return; }
n'est ce pas ?
Je suppose que cette remarque n'est plus valable si j'utilise uniquement le code d'invocation de la méthode (sans instancier la classe à partir de son nom) depuis une méthode faisant partie de la classe à laquelle appartiennent aussi les méthodes appelées à partir de leur nom en "String" ???Citation:
Envoyé par OButterlin
C'est à dire que je fais :
Code:
1
2 Double monResultat = (Double)maMethode.invoke(this,mesValeursDeParametre);
Juste pour savoir, c'est dans quel but que tu veux faire ça?
(Juste pour vérifier que c'est pas pour faire un "pointeur de fonction") :)
Comme je l'ai dit je suis débutant en Java (plus expérimenté en C++). La fonctionnalité voulue est véritablement l'appel immédiat de la fonction en évitant une grosse série de if...else...else...else (et non son référencement dans le but d'une utilisation plus tard... si je comprends bien le sens de la question). En C++ j'aurais probablement fait ça avec un pointeur de fonction que j'aurais utilisé tout de suite... ici la méthode proposée me convient très bien apparemment et me semble proche de la notion de pointeur de fonction. Pourquoi pose-tu cette question ? Il y aurait un risque à garder une référence de "maMéthode" ??Citation:
Envoyé par ®om
Si la méthode n'est pas publique, tu auras une SecurityException sur la ligne class.getMethod(...)Citation:
Envoyé par tnarol
Zut...Même si en fait je suis à l'intérieur de la classe concernée et si je fais :Citation:
Envoyé par OButterlin
???Code:
1
2 Method maMethode = this.getMethod(...);
Y'a pas de contournement pour ça ?
Si c'est pour un "pointeur de fonction", il faut utiliser le design pattern commande:Citation:
Envoyé par tnarol
Une interface définissant une méthode, que ta classe qui fournit le code cette méthode implémente.
Après tu peux appeler la méthode directement à partir d'une référence de type TonInterface.
Exemple: regarde par exemple Comparable dans la javadoc :)
Tu veux dire que tu utilises la reflexion pour invoquer une méthode de la classe de l'objet en cours ???
Oui tout à fait... en fait c'est une méthode qui recoit une String (venant d'un XML par exemple) qui est le nom de la méthode à invoquer et qui l'invoque... ça peut paraître un peu maladroit mais c'est vraiment nécessaire.Citation:
Envoyé par OButterlin
C'est pour éviter des if () else if () etc... sur tous les cas possibles je suppose...
Mais il n'y a pas de problème à priori, quand tu invoques la méthode, tu le fais comme ceci laMethode.invoke(this, lesParamètres);