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 :

Introspection et invoke method


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Points : 1
    Points
    1
    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 : 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 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 : 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
    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 !

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    un bout de code qui devrait t'inspirer

    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
    	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

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    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 : 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
    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".

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    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 :

    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

  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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Calcul {
        double calculer(double argument);
    }
    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
    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;
        }
    });

  6. #6
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    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!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String,FonctionMathematique> fonctionsDisponibles

  8. #8
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

Discussions similaires

  1. [introspection] Fields et Methods
    Par mezoo dans le forum Langage
    Réponses: 1
    Dernier message: 06/06/2011, 16h10
  2. Réponses: 0
    Dernier message: 08/10/2009, 10h08
  3. jsf spring hibernate invoke methode
    Par rasmusin dans le forum JSF
    Réponses: 3
    Dernier message: 17/04/2008, 09h01
  4. pb d'invoke de methode avec un tableau d'objets en parametre
    Par sebastien2222 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 27/09/2006, 10h33
  5. [Reflexivite]exception ArrayIndexOutOfBoundsException methode invoke
    Par caro_a dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 12/07/2006, 11h35

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