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 :

Comment appeler une méthode dont le nom est dans un string?


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut Comment appeler une méthode dont le nom est dans un string?
    Bonjour, j'ai besoin (comme le dit si bien l'intitulé du post) d'appeler une méthode à partir d'un nom contenu dans un string. Il y a déja une discussion ancienne sur ce sujet mais..je n'arrive pas à faire fonctionner les solutions proposées (je suis débutant ).
    Voila, est-ce que quelqu'un pourrait m'aider?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faut utiliser l'API de reflection...

    a++

  3. #3
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Grosso modo comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class classTypes [] = {(new String()).getClass()};
    Method getMethod = entity.getClass().getMethod("nom_methode", classTypes); 
    String args[] = {"param1","param2"};
          			getMethod.invoke(entity, args);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut
    Merci pour les réponses, mais j'ai le même problème avec les deux:
    J'ai une erreur sur Method m=... : Method can not be resolved to a type.
    J'utilise Eclipse 3.2.2 et jre 1.6.0. Qu'est ce que je peux faire?

  5. #5
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    as tu importé le package 'java.lang.reflect.Method' ?

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Il suffit de rajouter les imports correspondant (Ctrl+Shift+O avec eclipse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import java.lang.reflect.Method;
    ...
    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut ah..ben non
    Aie j'ai encore du mal...

    J'ai essayé le code de Willoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Class classTypes [] = {(new String()).getClass()};
    Method getMethod = entity.getClass().getMethod("nom_methode", classTypes); 
    String args[] = {"param1","param2"};
          			getMethod.invoke(entity, args);
    mais "entity" can not be resolved.

    J'ai aussi regardé le code de la docu API:

    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
     
    Object lancerMethode(Object o, Object[] args, String nomMethode) throws Exception
    {
      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 = o.getClass().getMethod(nomMethode,paramTypes);
      return m.invoke(o,args);
    }
    qui a l'air très bien, sauf que je ne sais pas quoi mettre pour Object o ni de quelles facon écrire les arguments de ma méthode (qui ont l'air d'aller dans "Object[] args").

    Au final, je suis toujours bloqué . Merci pour les réponses!

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Ireon
    Bonjour, j'ai besoin (comme le dit si bien l'intitulé du post) d'appeler une méthode à partir d'un nom contenu dans un string. Il y a déja une discussion ancienne sur ce sujet mais..je n'arrive pas à faire fonctionner les solutions proposées (je suis débutant ).
    Voila, est-ce que quelqu'un pourrait m'aider?
    Tu le récupères comment le nom de ta méthode dans un String?

  9. #9
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Bon quel code as-tu produit?
    Car le code que je t'ai donne fonctionne(il est en production actuellement), il faut l'adapter a ta methode!

    Montre voir la classe et la methode que tu veux appeler ainsi que le programme appelant.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Par défaut voila le programme
    Il s'agit d'un programme qui simule le dilemne du prisonnier. Pour le moment, il y a seulement deux strategies, dont les arguments sont muets (mais à terme..avec de la chance... il y en aura d'autres qui utiliseront ces arguments )

    Pour décrire rapidement, il y a deux méthodes qui représentent chacune un comportement: cooperer ou trahir. Des valeurs sont attribuées lors d'un match des deux comportements.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
     
    	import java.io.IOException;
    	import java.lang.reflect.Method;
    	import java.util.TreeMap;
    	import java.util.Vector;
    	import java.io.FileWriter;
    	import java.io.IOException;
    	import java.io.PrintWriter;
     
     
    	public class Strategies {
     
    		public TreeMap<String, Integer> ponderation;
     
    		/* on initialise les valeurs */
    		public void initialise_ponderation()
    		{TreeMap<String,Integer> ponderation= new TreeMap<String,Integer>();
    		ponderation.put("cooperation", 50);
    		ponderation.put("competition", 10);
    		ponderation.put("trahison", 60);
    		ponderation.put("trahi", 0);	
    		}
     
    		/* pour le moment, seulement deux strategies. historique et pos seront utilisés plus tard*/
    		public int gentil(Vector historique , int pos)
    		{	
    			return 1;
    		}		
    		public int mechant(Vector historique , int pos)
    		{	
    			return 0;
    		}
     
     
     
     
    		public void match(String strat1, String strat2,Vector historique) throws Exception
    		{
    			TreeMap resultat= new TreeMap<String,Integer>();
     
     
     
    			/* on initialise le vecteur qui donnera les résultats */
    			resultat.put(strat1, 0);
    			resultat.put(strat2, 0);
     
     
     
    			/* Voila la partie interessante*/
     
     
    			Strategies entity = new Strategies();
     
    			Class classTypes [] = {(new String()).getClass()};
    			Method getMethod = entity.getClass().getMethod(strat1, classTypes); 
     
    			String arg1[] = {"historique","0"};
    			int choix1 = (Integer) (getMethod.invoke(entity, arg1));
     
    			String arg2[] = {"historique","1"};
    			int choix2 = (Integer) (getMethod.invoke(entity, arg2));
     
     
     
     
     
     
     
     
    			/* on attribue les points selon les strategies*/
     
    			if ((choix1==0)&(choix2==0)) 
    			{resultat.put(strat1,ponderation.get("cooperation"));
    			 resultat.put(strat2,ponderation.get("cooperation"));		
    			}
    			if ((choix1==0)&(choix2==1)) 
    			{resultat.put(strat1,ponderation.get("trahi"));
    			 resultat.put(strat2,ponderation.get("trahison"));		
    			}
    			if ((choix1==1)&(choix2==0)) 
    			{resultat.put(strat1,ponderation.get("trahison"));
    			 resultat.put(strat2,ponderation.get("trahi"));		
    			}
    			if ((choix1==1)&(choix2==1)) 
    			{resultat.put(strat1,ponderation.get("competition"));
    			 resultat.put(strat2,ponderation.get("competition"));		
    			}
     
     
    			/* on ecrit le résultat*/
    			PrintWriter ecrire = new PrintWriter(new FileWriter("resultat.txt"));
    			ecrire.print(resultat.entrySet());
    			ecrire.close();
     
     
    		}
     
    		public static void main (String[] args) throws Exception{
    			Strategies entity= new Strategies() ;
    			Vector historique= new Vector();
    			entity.initialise_ponderation();
    			entity.match("mechant", "gentil", historique);
     
    		}
     
     
    }

    J'ai à chaque fois l'erreur "NoSuchMethodException".
    Merci beaucoup de l'aide en tout cas!

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Alors dans ce cas, il ne faut surtout pas utiliser l'introspection...

    Il faut que tu te fasses par exemple une interface qui contient une méthode action(), et tu fais deux classes qui l'implémentent, Cooperer et Trahir.

  12. #12
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Oui, je suis assez d'accord avec rom, sauf que Cooperer et Trahir represente plutot des actions(ce sont des verbes) que des objets.
    Donc plutot se tourner vers qqch du style Cooperant et Traitre.

    De toute facon ca ne sert pas a grand chose d'invoquer des methodes comme tu l'as fait tu peux tout a fait les appeler en direct.Mais a ta place je m'inspirerais plutot de l'idee de rom.

  13. #13
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    les méthodes gentil et mechant prennent en paramètre un vecteur et un int et non pas une String

  14. #14
    Membre expérimenté Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Par défaut
    Je suppose qu'il faut donc revoir ton tableau d'arguments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class classTypes [] = {Vector.class, int.class };
    ( je n'ai pas compilé ce code )

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/06/2012, 12h55
  2. appeler une fonction dont le nom est dans un parametre
    Par djams9 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 15/06/2011, 11h42
  3. Réponses: 3
    Dernier message: 05/02/2007, 09h41
  4. Réponses: 3
    Dernier message: 05/10/2006, 18h52
  5. Appel de methode dont le nom est dans une variable
    Par osopardo dans le forum Langage
    Réponses: 1
    Dernier message: 24/11/2005, 20h56

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