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 méthode d'une interface


Sujet :

Langage Java

  1. #1
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut [Introspection] Appel méthode d'une interface
    Bonjour,
    Je veux faire l'introspection et appeler une méthode d'une interface.
    J'ai exploré les autres posts et tuto sur l'introspection.
    Mon problème est le suivant :
    je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // nomInterface et une interface et non une classe
    Class c = Class.forName("nomInterface");
    J'aimerai appeler la méthode methode1() de cette interface. Je ne sais comment le faire car :
    1. On ne peut pas instancier l'interface comme dans le cas d'une classe. Une tentative de cette opération c'est à dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object o = c.newInstance();
    en vue de faire un invoke()
    crée une exception InstanciationException.
    2. On ne peut pas faire un invoke() directement sur c car il n'est pas un Object. Une tentative de cette opération c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Method m = c.getMethod("methode1", null);
    Object o = m.invoke(c);
    crée une exception IllegalArgumentException:object is not an instance of declaring class
    J'aimerai donc savoir
    1. Comment appeler une méthode à travers une interface ?
    ou
    2. comment (par introspectuon) obtenir la classe qui implémente une interface afin d'appeler directment la méthode sur l'instance de cette classe.

    Merci si quelqu'un a une idée.

  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
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu ne connais pas l'interface autrement que par son nom?

    2. comment (par introspectuon) obtenir la classe qui implémente une interface afin d'appeler directment la méthode sur l'instance de cette classe.
    Il peut y avoir une infinité de classe qui implémente une interface... Prend l'exemple de l'interface Comparable, y'a plein d'objets comparables, les String, les Integer...
    Où se trouve la méthode que tu veux appeler (car dans une interface il n'y a pas de code)?

    De manière plus générale, quel est le problème que tu veux résoudre? Es-tu sûr que l'introspection soit une solution adéquate?

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Bonjour et merci pour ta réponse,
    Oui je sais qu'une interface peut être implémentée par plusieurs classes.
    Y' a-t-il moyen (par introspection) d'obtenir l'ensemble des classes qui implémentent une interface ?
    En fait, mon problème est le suivant :
    J'ai le nom de mon interface et dans mon cas, une seule classe implémente cette interface.
    Où se trouve la méthode que tu veux appeler (car dans une interface il n'y a pas de code)?
    Elle se trouve dans la classe qui implémente mon interface.

    Merci

  4. #4
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu le récupères d'où le nom de ton interface?

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    J'ai une classe MonInterface qui a un champ String donnant le nom de mon interface.
    Quand j'instancie cette classe, j'initialise l'instance avec le nom de mon interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MonInterface {
       String nomInterface;
       public MonInterface(String nom) {
          nomInterface = nom;
      }
    }
    Dans la classe contenant le main()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // l'interface de nom "nomInterface existe dans le Classpath et il existe 
    //aussi une classe qui implémente cette interface.
    MonInterface i = new MonInterface("nomInterface");
    String nom = i.getNomInterface(); 
    Class c = Class.forName(nom)
    // Les problèmes commencent ici car je veux appeler une méthode de l'interface nomInterface
    Merci

  6. #6
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Et pourquoi tu donnes l'interface sous forme de String? Pourquoi tu ne donnes pas directement une instance de la classe que tu veux utiliser...? dans un attribut de type le type de l'interface...

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Pourquoi tu ne donnes pas directement une instance de la classe que tu veux utiliser...? dans un attribut de type le type de l'interface...
    Je ne te comprends pas bien.
    Un peu de précision STP.

    merci

  8. #8
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par zsoh Voir le message
    Je ne te comprends pas bien.
    Un peu de précision STP.

    merci
    Pour simplifier la question, dans quel but tu stockes le nom de l'interface sous forme de String dans ta classe "MonInterface"...?

  9. #9
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Je stocke le nom sous forme de String parceque je ne connais que le nom de cette interface et j'aimerai l'utiliser pour appeler les méthodes.

    Merci

  10. #10
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu ne connais pas que son nom, tu connais l'interface elle-même...
    Si j'ai bien compris ce que tu veux, tu n'as pas besoin de l'introspection... En gros tu veux juste le polymorphisme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonInterface interf = new ObjetImplementantLInterface();
    interf.method();

  11. #11
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Non je n'ai pas l'interface elle même.
    Si tu veux l'interface doit être générée automatiquement en fournissant son nom. Je recupère donc ce nom et j'appele les méthodes sur cette interface. c'est pour ça que je ne fais pas directement une instanciation de la classe qui implémente l'interface, car ce nom peut changer à tout moment et je dois être toujours capable d'utiliser cette interface quelque soit le nom qu'on lui donnera lors de sa génération.

    Merci

  12. #12
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par zsoh Voir le message
    Non je n'ai pas l'interface elle même.
    Si tu veux l'interface doit être générée automatiquement en fournissant son nom. Je recupère donc ce nom et j'appele les méthodes sur cette interface. c'est pour ça que je ne fais pas directement une instanciation de la classe qui implémente l'interface, car ce nom peut changer à tout moment et je dois être toujours capable d'utiliser cette interface quelque soit le nom qu'on lui donnera lors de sa génération.

    Merci
    Ah, en plus tu peux changer le nom de l'interface... Dans ce cas imagine que tu aies comme nom "Comparable" et que tu changes en "ActionListener", comment tu sais quelle méthode tu veux appeler?

    Excuse-moi d'insister, mais à un niveau un peu plus général (pas au niveau de l'implantation, mais au niveau du problème à résoudre, indépendamment de java), que veux-tu faire?


  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par zsoh Voir le message
    Oui je sais qu'une interface peut être implémentée par plusieurs classes.
    Y' a-t-il moyen (par introspection) d'obtenir l'ensemble des classes qui implémentent une interface ?
    Non.
    Et d'ailleurs, le resultat serait probablement faux (ou variable dans le temps si tu préfères), puisque les classes ne sont pas forcement chargées si elles ne sont pas utilisées.

  14. #14
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Bon je resitue mon problème.
    Je suis entrain de développer un Bus à qui on va souvent faire appel pour générer un ensemble de classes (selon le cas). J'encapsule l'ensemble qu'on doit générer dans une classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MIC {
         String micName; // nom du MIC
         MICInterface[] micInterfaces;
    }
    avec MICInterface comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MICInterface {
         String itfName; // nom de l'interface du MIC
         String itfType;  // son Type
         String itfSignature // La signature de l'interface
    // méthode que je dois utiliser pour exécuter une méthode d'une interface
    public void executer() {
      String signature = this.itfSignature;
      Class c = Class.forName(signature);
      // début des problèmes
    }
    }
    Pour donc utiliser mon interface, je procède ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // ce que je passe en paramètre pour instancier, je les obtiens lors de la génération car on génère seulement ces interfaces et leurs implémentations.
    // signatureItf1 et signatureItf2 sont les noms des interfaces qu'on génère sachant que leurs implémentations doivent être déduites, respectivement signatureItf1Impl et signatureItf2Impl.
    MICInterface[] micItfs = {new MICInterface ("nomItf1", "typeItf1", "signatureItf1"),new MICInterface("nomItf2", "typeItf2", "signatureItf2"
     
    MIC mic = new MIC("nomDuMIC", micItfs);
    // pour obtenir l'interface que je veux utiliser
    MICInterface micItf = mic.getSwitchInterface();
    micItf.executer();
    Merci

  15. #15
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Pourquoi tu ne fais pas une interface Executable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Executable {
        void execute();
    }
    Et au lieu de passer plein de trucs sous forme de String, tu passes une instance d'un objet qui implémente Executable...

  16. #16
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    S'il te plaît peux-tu me dire exactement comment utiliser cette interface Executable ?

    Merci.

  17. #17
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    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
    class AfficheBonjour implements Executable {
        @Override
        public void execute() {
            System.out.println("Bonjour");
        }
    }
     
    class AfficheAuRevoir implements Executable {
        @Override
        public void execute() {
            System.out.println("Au revoir");
        }
    }
     
    public class Test {
        public static void main(String... args) {
            Executable[] executables = { new AfficheBonjour(), new AfficheAuRevoir() };
            for(Executable executable : executables) {
                executables.execute();
            }
        }
    }

  18. #18
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Merci,
    Je vais tester et te donner le résultat.
    Je ne peux encore dire Résolu.

    A bientôt.

  19. #19
    En attente de confirmation mail

    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2003
    Messages : 219
    Points : 108
    Points
    108
    Par défaut
    Bonjour,
    Excuses moi de revenir.
    En fait je ne crois pas que cette solution peut résoudre mon problème.
    En effet, dans ton bout de 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
    17
    18
    19
    20
    21
    22
    class AfficheBonjour implements Executable {
        @Override
        public void execute() {
            System.out.println("Bonjour");
        }
    }
     
    class AfficheAuRevoir implements Executable {
        @Override
        public void execute() {
            System.out.println("Au revoir");
        }
    }
     
    public class Test {
        public static void main(String... args) {
            Executable[] executables = { new AfficheBonjour(), new AfficheAuRevoir() };
            for(Executable executable : executables) {
                executables.execute();
            }
        }
    }
    Le problème se situe au niveau des classes AfficheBonjour et AfficheAuRevoir
    En effet, c'est dans ces classes qu'il faut faire appel à l'interface pour l'utiliser.
    J'insiste sur l'interface pour appeler la méthode parceque je suis dans un contexte des composants logiciels où on n'accède à un composant qu'à travers son interface.

    Merci

  20. #20
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par zsoh Voir le message
    En effet, c'est dans ces classes qu'il faut faire appel à l'interface pour l'utiliser.
    Non, dans ces classes tu effectues le traitement que tu veux faire (le corps que tu voulais mettre au départ dans une méthode dont tu donnais le nom en String).

    Citation Envoyé par zsoh Voir le message
    J'insiste sur l'interface pour appeler la méthode parceque je suis dans un contexte des composants logiciels où on n'accède à un composant qu'à travers son interface.
    C'est exactement ce qu'on fait, on n'accède aux traitement que par l'interface Executable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Executable executable : executables) {
        executables.execute();
    }

Discussions similaires

  1. Appel méthode dans une classe Bean
    Par maserati dans le forum Général Java
    Réponses: 2
    Dernier message: 28/12/2011, 15h14
  2. Appeler méthode d'une Activity parente
    Par snyfir dans le forum Android
    Réponses: 6
    Dernier message: 09/05/2011, 09h54
  3. introspection des attributs d'une interface
    Par al3alwa dans le forum Langage
    Réponses: 7
    Dernier message: 02/07/2008, 18h32
  4. Réponses: 6
    Dernier message: 29/04/2008, 09h34
  5. appel méthode d'une dll
    Par spilmann dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 14/02/2007, 11h47

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