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

  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) {
     }
    }

  8. #8
    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
    Citation Envoyé par hibour Voir le message
    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
    Ha non je ne suis pas d'accord. Il y a aussi le problème des méthodes à nombre d'argument varialbes (ces joli trois petit points dont les dernièer jdk nous ont fait le plaisir) et le fait que les méthode privées, ben c'est pas des méthodes publiques et quand il y a ambiguité, si une des méthodes est privé, il y a pas d'ambiguité.... Le mieux c'est de prendre les spécifications du language, la liste des méthodes et suivre pas à pas l'algorithme dans les specs :p

  9. #9
    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
    Pour mon cas, c'est un peu simplifié, étant donné que je n'ai que des méthodes publiques, et pas de méthode avec nombre d'arguments variables

    D'autre part, je ne peux pas appliquer l'algo donné par hibour, étant donné que je ne travaille pas avec des instances d'objet, mais uniquement leur classe.

    J'ai bricolé un petit bout de code qui marchait bien dans mon cas, mais je vais jeter un oeil aux specs, et voir comment c'est décrit

+ 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