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 :

[Reflect] Recherche de méthode par introspection


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut [Reflect] Recherche de méthode par introspection
    Bonjour à tous,

    Je suis actuellement en train de développer une application qui nécessite l'utilisation de l'introspection, et plus particulièrement, de la recherche de méthode dans une classe donnée.

    Comme indiqué sur le tutoriel, la méthode utilisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method getMethod(String ident, Class... parametres)
    demande une correspondance exacte sur les types des paramètres formels, et ne teste pas si le paramètre fourni est une classé dérivée du paramètre formel

    Par exemple, soit la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Test {
      int maFonction(Number a) { return 1;}
    }
    Ainsi, la recherche suivante fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getMethod(Test.class, Number.class)
    tandis que celle-ci echouera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getMethod(Test.class, Integer.class)
    Je voudrais donc savoir si quelqu'un avait pu résoudre/entrevoir une solution à ce problème, avant de me lancer dans le codage de ma propre fonction de recherche de méthode.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ce n'est pas un problème pour moi.
    Pourquoi est-ce un problème pour toi ? Peut-être devrais-tu revoir ta technique de recherche de méthode ?
    Quels seront les critères pour sélectionner une méthode plutôt qu'une autre dans ton application ?
    En clair : explique pourquoi c'est un problème pour toi et ce que tu attends de nous
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    La méthode Class.getMethod(String methodName, Class[] paramTypes) retourne la méthode public nomée methodName et qui a exactement les paramètres définis dans paramTypes
    La méthode getMethod défini dans le tutoriel retourne à priori la méthode la plus spécialisée donc je ne vois où est ton problème!!!

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut
    Salut,

    C'est pour moi un problème, car j'ai des classes dérivées pour les paramètres lorsque je fais ma recherche.

    Pour reprendre mon exemple, je ne dispose pas lorsque j'effectue ma recherche du type Number, mais du type Integer. Ainsi, la recherche échoue (exception NoSuchMethodException levée).

    Mes critères pour rechercher une méthode sont les mêmes que ceux qui s'appliquent normalement en Java.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu va devoir prendre toutes les méthodes de la classe et déterminer celles qui s'appliquent à ton cas. Je dit celles car si tu applique les règle java et que tu a machin(String,String) comme critère de recherche, les méthodes machin(Object,String) et machin(String,Object) sont toutes les deux valables.

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut
    Merci tchize_, tu confirmes ce que je "craignais".
    Effectivement, il faudra penser à prendre en compte les cas "ambigus".

    Merci de vos réponses

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    tu va devoir prendre toutes les méthodes de la classe et déterminer celles qui s'appliquent à ton cas. Je dit celles car si tu applique les règle java et que tu a machin(String,String) comme critère de recherche, les méthodes machin(Object,String) et machin(String,Object) sont toutes les deux valables.
    Je suis d'accord avec tchize faut deja prendre les méthode qui ont N paramètre apres tu invoke avec tes arguments s'il n'y a pas d'exception tu sorte de la boucle un truc dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ;
    Method[] methods = getClass().getMethods();
    for(int i=0; i< methods.length; i++) {
    if (methods[i].getParameterTypes().length == args.length) {
     try {
      methods[i].invoke(tonObjet, args); //args array des valeurs de tes paramètres
      return methods[i];
      }catch (Exception e) {
     }
    }

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

Discussions similaires

  1. BeginInvoke sur une méthode par Reflection delegate
    Par jpbelmondo59 dans le forum C#
    Réponses: 0
    Dernier message: 02/06/2015, 10h58
  2. Réponses: 11
    Dernier message: 18/05/2010, 17h31
  3. Réponses: 2
    Dernier message: 17/05/2009, 00h31
  4. Réponses: 1
    Dernier message: 02/03/2007, 10h37
  5. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35

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