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

avec Java Discussion :

Tester l'existence d'une méthode dans une classe


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut Tester l'existence d'une méthode dans une classe
    comment connaitre l'existance d'une méthode dans un code?
    par exemple j'ai un objet Ag de la classe Agent et je cherche si la méthode calcule() existe dans le code de la classe Agent, càd, est ce qu'on peut appeler cette méthode par l'objet Ag.calcule()

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Salut,

    Tu peux faire avec un try catch !

    Tu créé une variable booléen que tu initialise à false.
    Ensuite, tu appelles ta méthode dans un try.
    Si ça passe, c'est qu'elle existe, alors tu passe le bouléen à true, si tu catche, tu gère l'erreur... ou pas

    Je pense que cela peut fonctionner !?!
    OS : LinuxMint 20

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Dude, il n'y a rien à vérifier.

    Si écrire Ag.calcule() compile, alors la méthode existe.
    Si ça ne compile pas, tu ne peux pas l'écrire.

    Il suffit d'essayer et tu sais. Il n'y a pas de mystère.

    Citation Envoyé par francky74 Voir le message
    Je pense que cela peut fonctionner !?!
    Probablement pas... Tu as essayé de voir ce que ça donne avec du code ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut
    mon objectif c'est de vérifier l'existence d'une méthode dans une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Agent extends SimpleAgent {
    public Agent(Vector3d pos, String name) {
            super(pos, name);
     
    //code
    }
     
     
    public void calcule(){
     
    //code
    }
    j'ai une classe Agent que je veut instancier un objet pour tester mon 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
    15
    16
     
    public class main {
     
    		  public static void main(String[] args){
    Agent Ag = new Agent(pos, name);
     
    if (Ag.calcule() existe ){
     
    //traitement 
     
    }
     
    else 
    System.out.println("l'agent  "+ Ag +"n'a pas les compétences requises pour faire le calcul");
     
    }
    c'est ça pratiquement mon objectif

    j'attends vos aide pour résoudre ce problème et merci d'avance.

  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
    Dans ton main ta classe référencée est des type Agent. Donc, elle A une méthode calcule, il n'y a rien à vérifier, il n'y a aucun chemin d'exécution qui amènerait à déterminer que la méthode n'existe pas. C'est quoi ton but au final, quel est le cas d'utilisation que tu essaie de résoudre? Parce que tu part dans une chemin impossible là.

    Oui, un peut déterminer qu'un objet quelconque qu'on a reçu d'on ne sait où possède une méthode bien précise. Oui on peut ensuite essayer de manière compliquée d'accéder à cette méthode. Mais non cela n'a absolument aucun intérêt dans ton code.
    Une Solution simple qui semble être lié à ton problème est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface AgentCompetent {
        public void calcule();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Agent extends SimpleAgent implements AgentCompetent  {
      public Agent(Vector3d pos, String name) {
            super(pos, name);
      }
     
     
      public void calcule(){
        //code
      }
    //...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Main {
     
      public static void main(String[] args){
        SimpleAgent Ag =  ..... creerSimpleAgent(pos, name);
        if (Ag instanceof AgentCompetent ){
          AgentCompetent Agc = (AgentCompetent) Ag;
          agc.calcule();
        }
        else 
          System.out.println("l'agent  "+ Ag +"n'a pas les compétences requises pour faire le calcul");
      }
    }

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 172
    Points : 55
    Points
    55
    Par défaut
    merci pour la réponse, mon objectif est le suivant : j'ai un ensemble d'agents caractérisés chacun par des compétences particulières. ces compétences sont représentées par des méthodes. par exemple j'ai les compétences calculer(), déplacer(), dessiner() et j'ai 5 agents. Par exemple je vais envoyer un message à tous les agents dont je cherche l'agent qualifié pour faire le calcule. chaque agent doit vérifier s'il possède cette compétence ou pas puis il envoi à son tour un message pour informer qu'il est apte ou bien non. donc comment un agent peut vérifier s'il possède cette méthode ou pas.
    merci pour vos aides.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    C'est plus intelligent d'utiliser les interfaces que de "vérifier les méthodes."

    Il n'y a alors qu'à vérifier si l'agent implémente l'interface voulue. Avec la ligne déjà montrée if (Ag instanceof AgentCompetent ){ .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    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 oumay Voir le message
    chaque agent doit vérifier s'il possède cette compétence ou pas puis il envoi à son tour un message pour informer qu'il est apte ou bien non. donc comment un agent peut vérifier s'il possède cette méthode ou pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public enum Competence {CALCUL, DEPLACEMENT, DESSIN}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class BaseAgent {
     
       public abstract boolean estCompetentPour(Competence competence);
       public void dessiner(){throw new IllegalAccessException("Agent incompétent pour le dessin");}
       public void deplacer(){throw new IllegalAccessException("Agent incompétent pour le deplacement");}
       public void calculer(){throw new IllegalAccessException("Agent incompétent pour le calcul");}
       //...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MonAgent extends BaseAgent {
       public boolean  estCompetentPour(Competence competence){
           switch (Competence) {
              case CALCUL:
                  return true;
              default:
                  return false;
           }
       }
       public void dessiner(){
           // faire du joli dessin
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BaseAgent agent = .....
    if (agent.estCompetentPour(Competence.DESSIN)) {
        agent.dessiner();
    }
    Tout simplement, pas besoin de tester l'existence d'une méthode particulière.

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 711
    Points : 4 797
    Points
    4 797
    Par défaut
    Citation Envoyé par oumay Voir le message
    comment connaitre l'existance d'une méthode dans un code?
    par exemple j'ai un objet Ag de la classe Agent et je cherche si la méthode calcule() existe dans le code de la classe Agent, càd, est ce qu'on peut appeler cette méthode par l'objet Ag.calcule()
    Dans ce cas pourquoi ne pas utiliser l'introspection ?

    Tu peux connaître la liste des méthodes de ton objet Ag (s'il est instancié) en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Method[] methodses = Ag.getClass().getMethods();
            for (Method method : methodses) {
                System.out.println(method.getName());
            }
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    En effet oui, l'usage de la reflection/l'introspection est bien plus approprié dans un tel environnement ou les agents ne sont probablement pas du même type et donc ou il faut réellement découvrir leurs capacités. C’était pourtant assez clair dans le descriptif de oumay.

    PS : pense a vérifier le type de retour ainsi que les paramètres des méthodes en plus de leur nom (tout est accessible via la classe java.lang.Method)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Ok... Pour ma culture personnelle, c'est quoi concrètement qui fait que les interfaces, ça marche très bien partout, sauf avec les agents ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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,

    Citation Envoyé par thelvin Voir le message
    Ok... Pour ma culture personnelle, c'est quoi concrètement qui fait que les interfaces, ça marche très bien partout, sauf avec les agents ?
    Les interfaces fonctionnent très bien aussi !
    C'est juste une autre manière de procédé où tu ne t'imposerais pas un héritage spécifique, un peu comme du duck-typing.



    Sinon à noter que depuis Java 7 on peut utiliser les MethodHandles à la place de la reflection.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	String instance = "Hello World";
     
    	MethodHandle handle = MethodHandles.lookup().findVirtual(instance.getClass(), "substring",
    			MethodType.methodType(String.class, int.class, int.class));
     
    	// Appel classique :
    	System.out.println( instance.substring(6, 11));
    	// Appel via le MethodHandle :
    	System.out.println( (String) handle.invoke(instance, 6, 11));
    L'API est plus souple et plus pratique...


    a++

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pas mal en effet et bien moins lourd comme manière de faire avec cette méthode lookup().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. [PHP 5.3] [POO] Appel d'une méthode dans une méthode
    Par yann18 dans le forum Langage
    Réponses: 6
    Dernier message: 20/10/2011, 09h56
  2. Appeler une méthode d'une applet dans une jsp
    Par salmoucha10 dans le forum Applets
    Réponses: 1
    Dernier message: 11/01/2011, 19h25
  3. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59
  4. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  5. "ajouter une méthode dans une méthode"
    Par Zorgloub dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2006, 12h53

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