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 : Appel d'une methode dynamique ?


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 172
    Par défaut Introspection : Appel d'une methode dynamique ?
    Bonsoir ,

    Je suis confronté à un probleme pour lancer une methode dynamique.
    En effet je souhaiterais lancer une methode de la classe java.lang.Math contenant un argument de type double.

    ex : abs(double);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     public double invoquer(String nomDeLaMéthode,double arg1) throws Exception{
         Class c = double.class; 
         Class[] paramTypes =  new Class[] {c};
         Method m = c.getClass().getMethod(nomDeLaMéthode,paramTypes);
              return m.invoke(o,arg1);
      }
    J'obtiens une erreur du type : attendu double.
    delà j'ai opté une conversion explicite en double.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               return (double) m.invoke(o,arg1);
    un message d'erreur apparait me signalant "inconvertibles types".

    Pourtant l'argument que j'ai passé en parametre est double.
    Si vous avez une idée de l'erreur que j'ai commise, pouvez vous m'en faire part.

    Merci d'avance.

  2. #2
    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
    C'est une mauvaise utilisation de l'introspection...

    Pour réaliser un appel de la même manière qu'un pointeur de fonction, il faut utiliser une Commande, grâce à une interface.

  3. #3
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    Citation Envoyé par stardeus
    (...)J'obtiens une erreur du type : attendu double.
    delà j'ai opté une conversion explicite en double.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               return (double) m.invoke(o,arg1);
    un message d'erreur apparait me signalant "inconvertibles types".
    (...)
    il faut passer en Double et non double, car c'est un type primitif qui est incompatible avec le type classique Object de la méthode invoke().

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 172
    Par défaut
    Bonjour,


    il faut passer en Double et non double, car c'est un type primitif qui est incompatible avec le type classique Object de la méthode invoke().
    Effectivement le double que j'utilisais etait un type primitive.

    Donc j'ai modifié le code et voici ce que cela donne.

    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 double invoquer(String nomDeLaMéthode,double arg1) throws Exception{
                double result = 0.0;
                Class c = Double.class; 
                Class[] paramTypes =  new Class[]{Double.class};
                Object[] arguments =  new Object[]{arg1};
                try {
                       Method m = c.getClass().getMethod(nomDeLaMéthode,paramTypes);
                       result = (Double)m.invoke(nomDeLaMéthode,arguments);
                    }catch(NoSuchMethodException e)
                   {
                     System.out.println(e);       
                   }catch(NumberFormatException nfe)
                   {
                    System.out.println(nfe);               
                   }               
                   return result;            
      }
    Désormais je n'ai aucune erreur a la compilation. Le resultat attendu ne fait pas appel a la methode.Pourriez me donner une piste . Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Pour réaliser un appel de la même manière qu'un pointeur de fonction, il faut utiliser une Commande, grâce à une interface.
    Je ne vois pas ce que tu veux entendre par Commande.

  5. #5
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 172
    Par défaut
    Bonjour,

    Je me demandais pourquoi me referes tu à ce lien dont on parle du design pattern?

    merci

  7. #7
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Pour réaliser un appel de la même manière qu'un pointeur de fonction, il faut utiliser une Commande, grâce à une interface.
    D'où le design pattern command. Tu lis des fois les réponses ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/01/2013, 14h19
  2. Appel d'une methode VBA en C++
    Par safae dans le forum C++
    Réponses: 8
    Dernier message: 14/04/2006, 14h53
  3. forcer l'appel d une methode apres un repaint
    Par ceres02 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 11/03/2006, 00h17
  4. [Language]problème lors de l'appel d'une méthode
    Par Samanta dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2005, 13h03
  5. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07

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