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 :

Invoquer une fonction à partir de son nom sous forme de String


Sujet :

Langage Java

  1. #1
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut Invoquer une fonction à partir de son nom sous forme de String
    Salut,

    J'expose brièvement mon problème.

    J'ai un ArrayList contenant des chaînes de caractères (utiles pour un usage dynamique). Parmi ces chaînes je dois récupérer une seule, en fonction d'un ensemble d'éléments et cette fonction correspond à un nom de fonction dans ma classe.

    Je voudrais exécuter cette fonction qu'à partir du nom sans avoir à effectuer un ensemble de tests.

    Je sais qu'il existe la fonction invoke mais visiblement je dois pas savoir la faire fonctionner... J'ai vu ceci dans la FAQ : Comment lancer dynamiquement une méthode de classe donnée ? mais jusque là toujours rien

    je voudrais faire quelque chose de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.invoke("nom", null);
    mais ça ne fait rien et j'ai une grosse erreur dans eclipseet à mon avis c'est normal mais je vois pas pourquoi il ne veut pas l'accepter

    Auriez-vous une idée ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    parce que la méthode invoke se trouve sur les objets de la classe Method, commre très bien indiqué dans la FAQs que tu as utilisé:

    http://java.developpez.com/faq/java/...onmethodinvoke

  3. #3
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Justement c'est ce que j'ai fait :
    Création d'un objet Method et invocation mais il ne me fait rien et surtout une erreur dans eclipse.

    Le code donné plus haut est là pour illustrer ce que je veux faire...

  4. #4
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    Citation Envoyé par Kerod Voir le message
    Justement c'est ce que j'ai fait :
    Création d'un objet Method et invocation mais il ne me fait rien et surtout une erreur dans eclipse.

    Le code donné plus haut est là pour illustrer ce que je veux faire...
    Tu peux nous montrer le code (juste la création de l'objet Method et invoke) et l'erreur affichée par Eclipse ?

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par djo.mos Voir le message
    Salut,


    Tu peux nous montrer le code (juste la création de l'objet Method et invoke) et l'erreur affichée par Eclipse ?
    Histoire d'illuster ce que tu fais.

  6. #6
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Voici un exemple de ce que je fais :

    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
     
    public class maclasse
    {
          private void test()
          {
                System.out.println("test");
          }
     
          private void launcher(String nom)
          {
                 Method m = this.getClass().getMethod(nom, null);
                 m.invoke(this, null);            
          }
     
          public static void main(String[] args) throws Exception { 
                 launcher("test");
          }
    }
    Et quand je compile j'ai ça :
    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    Unhandled exception type NoSuchMethodException
    Unhandled exception type IllegalAccessException
    Unhandled exception type InvocationTargetException
    Et l'erreur porte sur la première ligne Method m ...

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Unhandled exception type NoSuchMethodException
    Unhandled exception type IllegalAccessException
    Unhandled exception type InvocationTargetException
    tu dois traiter ces exceptions renvoyés par getMethod dans un bloc try catch

  8. #8
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut
    public Method getMethod(String name,
    Class<?>... parameterTypes)
    throws NoSuchMethodException,
    SecurityException

    Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object
    il faut que ta méthode soit public

  9. #9
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Donc voilà j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
            {
                Method m = this.getClass().getMethod("nom", (Class<maclasse>)null);
                m.invoke(this, (Object[])null);
            }
            catch(NoSuchMethodException e) {}
            catch(IllegalAccessException ex) {}
            catch(InvocationTargetException exc) {}
    Et tout est OK...

    pour vos précisions

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ce genre de code devrais être banni, ca droppe silencieusement les erreurs sans les traiter!

  11. #11
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Oui oui mais pour le moment c'est pour le test.

    Ma classe finale n'est pas celle que j'ai mis ici et surtout elle se limite pas à 2 fonctions...Donc tout ce qui peut être rajouté après le sera...

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Dans les cas où les exceptions ne devraient jamais arriver, il serait plus judicieux d'utiliser une runtime exception (qui n'a pas besoin d'être traité) plutôt que de les ignorer ou de se contenter d'un log qui pourrait passer inaperçu.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (Exception e) {
        throw new IllegalStateException("bla bla", e);
    }
    Ce genre d'exception n'a pas à être traité dans le code, ainsi on n'a plus à se soucier des de la gestion d'exception qui ne devraient pas remonter.

    Par contre en cas de mauvaise config ou autre erreur, l'exception remontera et plantera le programme plutôt qu'ignorer le problème et continuer l'exécution...

    Cela correspond à un code fail-fast, qui permet de remonter plus vite à l'origine du problème

    En effet en ignorant complètement une exception on entraine d'autres problèmes par la suite qui seront moins facile à comprendre !


    a++

  13. #13
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Salut,

    Il semblerait que ça marche pas ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    try {
                        Method m = this.getClass().getMethod("goToPowerDot", (Class<MyAgent>)null);
                        m.invoke(this, (Object[])null);
     
                    } catch (NoSuchMethodException nse) {
                        System.out.println("catch 1");
                        // TODO: handle exception
                    }
                    catch (IllegalAccessException iae) {
                        System.out.println("catch 2");
                        // TODO: handle exception
                    }
                    catch (InvocationTargetException ite) {
                        System.out.println("catch 3");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void goToPowerDot()
        {
            System.out.println("OKKKKKKKKKKKKKKKKKKKKKK");
        }
    C'est un petit test avec de vrai fonctions mais je tombe toujours dans le catch 1

    Avez-vous une idée du mal ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Je ne connais pas trop la réflection, mais essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method m = this.class.getMethod("goToPowerDot", (Class<MyAgent>)null);
    en remplaçant "this" par le nom de ta classe. C'est ce que je fais, et moi ça marche (à moins d'une autre erreur que je ne verrais pas, mais justement, je vois pas )
    Pensez au tag quand votre problème est réglé !

  15. #15
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ben l'erreur survient à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method m = MyAgent.class.getMethod("FctQuiSertARien", (Class<MyAgent>)null);
    Il me donne catch 1 (qui affiche l'erreur suite au catch).

    Pourtant la fonction existe dans la classe MyAgent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void FctQuiSertARien () {
     
        }

  16. #16
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    ta méthode n'a pas d'arguments donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Method m = MyAgent.class.getMethod("FctQuiSertARien");
    ci-dessous un exemple qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import java.lang.reflect.Method;
     
    public class Test {
    	public static void main(String args[]) throws Exception {
    		Test test = new Test();
    		Method m = test.getClass().getMethod("hello");
    		m.invoke(test);
    	}
     
    	public void hello() {
    		System.out.println("Hello");
    	}
    }
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Je dirais plutôt que c'est parcequ'elle ne retourne rien (void).
    Personnellement, j'utilise la même fonction, et elle fonctionne (bon c'est sur qu'appeler "null", c'est moins propre, merci pour le nettoyage :p). La seule différence, c'est que la mienne retourne un String.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
    		Method varMéthode = NPreferencesVariables.class.getMethod("nomMéthode",null);
    		return (String)this.varMéthode.invoke(this,(Object[])null);
    	}
    	public String nomMéthode() {
    		return "blabla";
    	}
    Pensez au tag quand votre problème est réglé !

  18. #18
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Ok ça fonctionne quand je souhaite ne pas passer d'arguments.

    Maintenant que je veux lui passer un simple argument je retombe sur mon catch 1

  19. #19
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    ci dessous un test avec quelques cas de figure, tout fonctionne :
    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
     
    import java.lang.reflect.Method;
     
    public class Test {
    	public static void main(String args[]) throws Exception {
    		Test test = new Test();
     
    		Method m = test.getClass().getMethod("hello");
    		m.invoke(test);
     
    		Method m2 = test.getClass().getMethod("hello2",String.class);
    		m2.invoke(test,"Hello");
     
    		Method m3 =  test.getClass().getMethod("getString");
    		System.out.println(m3.invoke(test));
     
    		Method m4 =  test.getClass().getMethod("getString2",String.class);
    		System.out.println(m4.invoke(test,"World"));
    	}
     
    	public void hello() {
    		System.out.println("Hello");
    	}
     
    	public void hello2(String s) {
    		System.out.println(s);
    	}
     
    	public String getString() {
    		return "Hello";
    	}
     
    	public String getString2(String s) {
    		return "Hello "+s;
    	}
    }
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  20. #20
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    Merci pour cet énorme exemple.

    Ca fonctionne parfaitement maintenant

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/05/2013, 17h32
  2. Réponses: 7
    Dernier message: 11/12/2008, 18h45
  3. 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
  4. Réponses: 6
    Dernier message: 06/04/2007, 21h20
  5. [VBA] Executer une fonction en passant son nom en argument
    Par David Guyon dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2005, 19h56

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