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

Langage Java Discussion :

Appel d'une méthode à partir d'un nom de méthode


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Appel d'une méthode à partir d'un nom de méthode
    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.

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    A ma connaissance ca n'éxiste pas.
    Si jamais ca existe je suis preneur!!!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Salut tnarol,
    Une solution à ton probleme serait par exemple d'utiliser switch ou des if:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:...
      }
    }
    Après cela depend de çe que tu veux vraiment!

  4. #4
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    VIVE LA "REFLECTION" !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  5. #5
    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
    Citation Envoyé par g_rare
    VIVE LA "REFLECTION" !
    +1

    Et pour plus de détail : Introspection en JAVA, présentation de l'API Reflection

    a++

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par iutcien
    Salut tnarol,
    Une solution à ton probleme serait par exemple d'utiliser switch ou des if:
    Bien sûr le but est d'éviter celà...

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par g_rare
    VIVE LA "REFLECTION" !
    Super c'est exactement ça. Merci.

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par g_rare
    VIVE LA "REFLECTION" !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Method maMethode = maClasse.getMethod(monNom2,mesTypesDeParametre);
    Si aucune méthode ne correspond je suppose que ça donne "maMethode == null" ????

  9. #9
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    VIVE LA JAVADOC !

    Throws:
    NoSuchMethodException - if a matching method is not found or if the name is "<init>"or "<clinit>".

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    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...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par g_rare
    VIVE LA JAVADOC !

    OK donc si je veux ne rien faire si la méthode échoue je peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
    {
    Method maMethode = maClasse.getMethod(monNom2,mesTypesDeParametre);
    }
    catch (Exception e)
    {
     return;
    }

    n'est ce pas ?

  12. #12
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par OButterlin
    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...
    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" ???

    C'est à dire que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Double monResultat = (Double)maMethode.invoke(this,mesValeursDeParametre);

  13. #13
    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
    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")

  14. #14
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par ®om
    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" ??

  15. #15
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tnarol
    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" ???

    C'est à dire que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Double monResultat = (Double)maMethode.invoke(this,mesValeursDeParametre);
    Si la méthode n'est pas publique, tu auras une SecurityException sur la ligne class.getMethod(...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par OButterlin
    Si la méthode n'est pas publique, tu auras une SecurityException sur la ligne class.getMethod(...)
    Zut...Même si en fait je suis à l'intérieur de la classe concernée et si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Method maMethode = this.getMethod(...);
    ???
    Y'a pas de contournement pour ça ?

  17. #17
    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 tnarol
    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" ??
    Si c'est pour un "pointeur de fonction", il faut utiliser le design pattern commande:
    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

  18. #18
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu veux dire que tu utilises la reflexion pour invoquer une méthode de la classe de l'objet en cours ???
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par OButterlin
    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.

  20. #20
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    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);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/10/2009, 15h19
  2. Appeler une fonction à partir de son nom
    Par superpigeon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/05/2008, 09h56
  3. Récupérer une variable à partir de son nom ...
    Par CynO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/10/2005, 16h59
  4. [javascript] appel d'une fonction à partir d'une popup
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/08/2005, 15h14
  5. appel d'une fonction à partir d'un popup
    Par villeneuvejsp dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/12/2004, 17h00

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