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 :

[Commons Discovering] Chercher plusieurs implementations


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Par défaut [Commons Discovering] Chercher plusieurs implementations
    Bonjour a tous,
    J'essaie d'utiliser Commons Discovering pour rechercher les classes qui implementent une certaine interface Modulable.class

    J'arrive tres bien a rechercer UNE classe qui implemente cette interface avec ce morceau 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
            ClassLoaders loaders =
            	ClassLoaders.getAppLoaders(Modulable.class, getClass(), false);
     
            DiscoverClass discover = new DiscoverClass(loaders);
     
            Class implClass = discover.find(Modulable.class);
            System.err.println("Implementing Provider: " + implClass.getName());
     
    		try {
                Modulable modulable =
                	(Modulable) Beans.instantiate(
                		implClass.getClassLoader(),implClass.getName());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    Le probleme de ce code c'est qu'il permet uniquement de retrouver la premiere classe implementant l'interface.

    Comment faire pour retrouver TOUTES les classes implementant l'interface ?
    J'ai essaye en partant de DiscoverClasses mais ca ne marche pas.

    Quelqu'un aurait deja utilise Commons Discovering dans ce cas ? Ou bien si vous avez d'autres solutions a me proposer, je suis preneur aussi!

    Merci d'avance,
    sylvain_2020

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Par défaut
    Personne ne sait ?

    Ou sinon, une autre facon ou un piste pour determiner les classes qui implemente une interface donnée ?

  3. #3
    Membre expérimenté
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Par défaut
    As tu regardé la javadoc

    Disons que certaines personnes font des efforts pour écrire une javadoc qui donne un minimun de documentation sur l'utilisation de l'outil

    DiscoveryClasses : ca c'est la classe à utiliser

    Je te laisse chercher dans la Javadoc pour savoir quelle méthode utiliser (surtout qu'il n'y en a qu'une)

    PS: Ne t'offusque pas de ma remarque mais c'est pour te signaler qu'il m'a fallu environ 21 secondes pour trouver ta réponse (et encore je suis en modem RTC)

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Par défaut
    Merci au moins pour essayer de m'aider mais j'aurais prefere un morceau de code qui fonctionne plutot qu'une remarque comme celle-ci.
    Si j'ai mentionne DiscoveryClasses , dans mon post c'est surement parce que je l'ai vue dans la JavaDoc, non ?

    Bref, restons constructif. Le morceau de code que j'ai poste ci-dessus fonctionne. En executant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ClassLoaders loaders =
            	ClassLoaders.getAppLoaders(Modulable.class, getClass(), false);
     
            DiscoverClass discover = new DiscoverClass(loaders);
     
            Class implClass = discover.find(Modulable.class);
            System.err.println("Implementing Provider: " + implClass.getName());
    Ca m'imprime a l'ecran :
    Implementing Provider: com.logis.proyecto.modulocentral.logic.modulable1.Module1
    Ce qui est effectivement le nom de la classe qui implemente mon Interface Modulable.

    A present, en essayant d'utiliser DiscoverClasses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            ClassLoaders loaders =
            	ClassLoaders.getAppLoaders(Modulable.class, getClass(), false);
            DiscoverClasses discoverClasses = new DiscoverClasses(loaders);
            ResourceClassIterator resourceClassIterator =
            discoverClasses.findResourceClasses(Modulable.class.getName());
     
            while(resourceClassIterator.hasNext()){
                ResourceClass resourceClass = resourceClassIterator.nextResourceClass();
                Class implClass = resourceClass.loadClass();
                System.err.println("Implementing Provider: " + implClass.getName());
            }
    Ca m'imprime a l'ecran :
    Implementing Provider: com.logis.proyecto.application.logic.Modulable
    Qui est le nom de l'Interface ...

    Certes il n'y a qu'une methode ... mais je n'arrive pas a l'utiliser d'ou mon post. Si tu vois d'ou vient le probleme ou si tu as une autre idee, je suis tout ouie ...

  5. #5
    Membre expérimenté
    Inscrit en
    Octobre 2002
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 164
    Par défaut
    Salut,

    Tout d'abord toutes mes excuses pour mon post précédent : je m'étais concentré sur ton code et je n'avais pas vu ton essai avec DiscoveryClasses.

    Donc pour me faire pardonner voici le résultat de mon analyse avec code et tout le toutime (une fois n'est pas coutume) :

    Voici le code de mon application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    package org.jidjo;
    public interface Namer {
      public String getName();
    }
    public static void main(String[] args) {
     // on verra plus loin ce code là
    }
    Et ci après le code d'une librairie qui va fournir les différentes implémentations du service Namer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package org.test;
    public class Namer1 implements Namer {
      public String getName() { return "name1"; }
    }
     
    package org.test;
    public class Namer2 implements Namer {
      public String getName() { return "name2"; }
    }
    Bien sûr cette librairie doit s'appuyer sur l'application pour compiler ou mieux sur une autre librairie qui ne définit que l'interface Namer (type spécification)

    De plus dans cette librairie (celle qui définie les implémentations de Namer) tu dois définir le fichier suivant META-INF/services/org.jidjo.Namer avec les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    org.test.Namer1 # Implementation 1
    org.test.Namer2 # Implementation 2
    Voilà pour le contexte ensuite vient la partie de code qui va retrouver tes implémentations (dans l'application) :

    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
     
    ClassLoaders loaders = ClassLoaders.getAppLoaders(Namer.class, this.getClass(), true);
    ResourceNameIterator rni = new DiscoverServiceNames(loaders).findResourceNames(Namer.class.getName());
    ResourceClassIterator classes = (new DiscoverClasses(loaders)).findResourceClasses(rni);		
    while (classes.hasNext()) {
      Class clazz = classes.nextResourceClass().loadClass();
      Namer namer;
      try {
        namer = (Namer)clazz.newInstance();
        System.out.println("Namer name="+namer.getName());	
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    Voilà c'est la seule technique que j'ai réussi à faire marcher. J'ai l'impression (d'après le code source) que DiscoveryClasses fait uniquement appel aux différents ClassLoader. Il faut donc lui passer le nom des classes complètes pour qu'il les retourne (seul avantage c'est qu'il fournit le ClassLoader qui va bien pour charger la classe). C'est pour cela qu'il faut passer DiscoverServicesNames.

    Toutefois je n'ai pas exploré le système de propriétés pour savoir comment cela marché. Car en fin de compte ce système de Service Discovery vient du JDK 1.3 et est la dernière technique prise en compte par DiscoverServiceProvider cad que tu peux aussi spécifier tes services par propriété système.

    Voilà j'espère que cela répond à ton besoin et encore désolé pour mon coup de gueule.

  6. #6
    Membre expérimenté
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Par défaut
    Salut,
    En effet, ca fonctionne tres bien avec DiscoverServicesNames.

    Merci beaucoup pour ton aide, tout marche impeccable a present.

    sylvain_2020

    ps : t'en fais pour ton "coup de gueule", ca arrive a tout le monde ...

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

Discussions similaires

  1. Chercher plusieurs sous chaines dans une chaine
    Par unix27 dans le forum Langage
    Réponses: 5
    Dernier message: 02/11/2011, 23h57
  2. [MySQL] Chercher plusieurs mots dans une colonne
    Par persia dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/08/2011, 14h56
  3. Réponses: 3
    Dernier message: 26/01/2008, 12h40
  4. chercher une expression dans plusieurs fichiers ?
    Par condor_01 dans le forum Ubuntu
    Réponses: 3
    Dernier message: 11/09/2007, 20h28
  5. Méthode find avec plusieurs mots à chercher
    Par domb_st dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/06/2007, 17h33

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