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 :

[Reflection] Classes implémentant une interface


Sujet :

API standards et tierces Java

  1. #1
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut [Reflection] Classes implémentant une interface
    Salut, une petite question...

    Je voudrais savoir si il existe une méthode programmative (reflexion ou autre) pour connaitre toutes ler classes d'une arborescence de package qui implémentent une inerface spécifiée ou les inerfaces qui sous classent cette interface...

    Sinon, j'ai vu que Jakarta propose un package discovery: à quoi sert-il et comment l'utiliser, il y à la classe Service qui me semble intéressante...

    A+

  2. #2
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    bonjour,

    dans la classe java.lang.Class

    Class[] getInterfaces()
    Determines the interfaces implemented by the class or interface represented by this object.
    bon courage.

  3. #3
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Oui mais c'est le problème inverse que je veux:

    j'ai une interface et je vaux connaitre toutes celles qui implémnentent

    C'est pas j'ai une class et je veux connaitre toutes ces interfaces !!!

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 91
    Points : 130
    Points
    130
    Par défaut
    Hello,

    C'est assez difficile à faire, car il faut que l'ensemble des classes que tu espères trouver aient été chargée par le ClassLoader... ce qui ne ce fait que lorsque ton application les références (instantiation, appel statique...)

    De plus quelle sera ton domaine de recherche : les classes disponibles dans ton classpath ? Si c'est le cas, il faudrait que l'ensemble des classes soit chargée par le ClassLoader !

    Il faut chercher une autre solution. Peux-tu préciser un peu ton but, pour ques les réponses soient plus avisées ?

    Cédric

  5. #5
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    C'est tout simple je voudrais créer un factory, sachant que ma factory va me renvoyer un objet implémentant l'interface BeanAffichage, si un objet qui implémente cette interface est ajouté, je voudrais que la factory puisse mettre à jour toutes les classes candidates, sans avoir à modifier un fichier de properties ou un sinbgleton contenant l'ensemble des noms de classes...

    (Oups... je sais pas si je suis très clair)

  6. #6
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Ca doit bien être possible pourtant ...

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    J'ai un peu de mal a suivre ce que tu veux faire mais peut-etre que le package java.lang.ref pourra t'aider (WeakReference ...)

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  8. #8
    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, tu pourrais t'inspirer de ce qui est fait avec les Driver SQL :

    Tu ajoutes dans ta factory deux méthodes static pour 'inscrire' et 'desinscrire' des classes qui impléméntent ton interface...

    Puis dans chaques classes qui implemente ton interface, tu ajoute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MonBeanAffichage implements BeanAffichage {
     
    	static {
    		BeanFactory.registerBean ( /* quelquechose */ );
    	}
     
    	/* Constructeur et autres méthodes */
    }
    Et dès que ta classe sera chargé par le ClassLoader le code dans la partie static { ... } sera exécuté et ta classe sera donc enregistré dans ta factory...

    Sinon tu peux faire quelque chose d'équivalent en surchargeant le ClassLoader et en verifiant le type de toutes les classes chargé...

    a++

  9. #9
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Je peux essayer avec un initialisateur statique ok... mais je voudrais faire de la façon suivante:

    Pour ne pas avoir à re-écrire l'initialisateur statique dans chaque sous-classe je voudrais changer BeanAffichage et en faire une classe abstraite (jusque là pas de problème), puis mettre l'initialisateur statique dans BeanAffichage (comme ça l'enregistrement est commun à toutes les sous-classes)... Or pour enregistrer ma classe dans la factory j'ai besoin soit du nom de la classe soit de tout autre identifiant unique...

    Alors comment puis-je faire au niveau de la classe abstraite (BeanAffichage) pour avoir un identifiant unique (correspondant à chaque sous-classe) et ceci accesssible depuis une méthode de classe (aïe, aïe ... je suis de moins en moins clair) ...

    Merci pour toute suggestion ...

  10. #10
    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,

    Dans ce cas tu peux utiliser un initialisateur non-statique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public abstract class BeanAffichage {
    	{
    		System.out.println ( "Creation de " + this.getClass().getName() );
    	}
     
    	/* methode... */
    }
    Mais du coup deux inconvienient :
    • Il n'est pas exécuté lorsque tu fais un Class.forName()
      Il est exécuté à chaque creation d'un nouvel objet...


    A toi de voir !

  11. #11
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Même dans ce cas ça ne vas pas fonctionner parceque je récupère la classe par son nom et je fais un classForName or si la classe n'est pas référencée, je ne peux pas faire de classForName et donc elle ne pourra pas s'enregistrer...

  12. #12
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    J'ai fais une classe qui je pense répond à ton besoin, mais bien rien ne vaut le fait de la faire sois-même. donc je veux bien t'aider en te donnant des indice (mais pas trop de code ).
    Voici comment je l'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // SEARCH_FROM_SUBPACKAGE=mce/treatment/count avec mce la racine des packages de mon projet
    String searchFrom = PropertiesManager.getInstance().getProperty(PropertiesManager.COUNTERS_PARAM, "SEARCH_FROM_SUBPACKAGE");
    // searchFrom : on recherche les classes dans le sous-packages définie
    // mce.treatment.count.AbstractCount.class : la classe mère
    // false inclut ou non la classe mère dans le résultat
    FindSubClass fsc = new FindSubClass(searchFrom, mce.treatment.count.AbstractCount.class, false);
    AbstractCount select = null;
    try{
                    // je récupère la liste des classe héritant de classe mère et se trouvant dans un des sous réperpertoire du répertoire donné
    		List l = fsc.getClassListe();
    ......
    ......
    Est-ce bien quelque chose comme ça que tu veux ?

  13. #13
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Oui c'est quelquechose comme ça...

  14. #14
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    aller un peu d'aide :
    egrep "((public)|(private)|(protected)|(\*))" src/mce/util/FindSubClass.java
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    /**
     * Cette classe doit permette de récupérer une Liste de classes non-abstraite ni interface, qui hérite d'une classe mère.
     * Celà doit me permettre de gérer plus facilement les drivers. Les classe sont recherchées récursivement dans un répertoire (et donc dans ses sous-répertoire).
     */
    public class FindSubClass{
            private String pack;
            private File path;
            private Class mother;
            private boolean addMother;
            /**
             * Constructeur
             * @param p Le package à partir duquel on cherche les classes
             * @param m Le type des classes que l'on cherche
             * @param addMother Ajoute ou non la classe mère dans le résultat si elle n'est ni abstraite ni interface
             */
            public FindSubClass(String p, Class m, boolean addMother) throws IllegalArgumentException{
            /**
             * Cette méthode me renvoie la liste des classe fille de mother à partir de path
             */
            public List getClassListe() throws IOException{
            /*
             * Le chemin doit être un répertoire existant
             * Voici comment je récupère le chemin :
             * java.net.URL u = ClassLoader.getSystemClassLoader().getResource(p);
             * f = new File(u.getPath());
             */
            private File buildPath(String p) throws IllegalArgumentException{
            /**
             * Récupère toutes les class du répertoire donnée et de ses sous-répertoires.
             * Seul les classes sans '$' sont sélectionnées.
             * J'utilise root.listeFiles() conjointement avec un FileFilter
             *      File[] allFile = root.listFiles(new FileFilter(){
             *                                      public boolean accept(File file){
             *                                              return (file.isFile() && file.getName().endsWith(".class") && file.getName().indexOf('$')<0);
             *                                      }
             *                              }
             *                      );
             * Je récupère aussi les sopus répertoire pour rechercher aussi leurs classes
             */
            private List findAllClass(File root) throws IOException{
                                                    public boolean accept(File file){
                                                    public boolean accept(File file){
            /**
             * Cette méthode filtre les classes trouvé pour ne garder que celles dont la méthode Class.isAssignableFrom(Class ) et la classe mère si le flag est à true
             */
            private List filtreClass(List allClass){

  15. #15
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Ca veut dire que tu scannes tout tes sous-repertoires et que tu recherches un fichier se terminant par .class et étant sous classe de ta classe mère.

    C'est clair j'y ai pensé à ça, mais ça m'as semblé bien lourd, à moins de mettre mes classes à rechercher dans des packages spécifiques...

  16. #16
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    Par défaut
    bien évidemment qu'il faut les mettre dans n package spécifique. Tu ne vas pas t'amuser à parcourir tout le disque dur ! Le truc est que tu peux créé un package par en semble de class sous celui de la class mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    pack0/ .... / packn/-- ClassMere
                                        /- packX/-- SousClassMere1
                                                    /-- ClassToto
                                        /- packY/-- SousClassMere1
                                                    /-- ClassTiti
                                                   /-- ClassTutu
    etc...

  17. #17
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Une question une fois la liste des fichiers, comment tu lis pour avoir un objet Class ou autre...

  18. #18
    Membre expérimenté
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Points : 1 680
    Points
    1 680
    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
    		for(int i = 0; i<allFile.length; i++){
    			String n = allFile[i].getName();
    			Class c = null;
    			try{
    				String s = allFile[i].toString();
    				s = s.substring(0, s.length()-6);
    				c = ClassLoader.getSystemClassLoader().loadClass(s.substring(path.getAbsolutePath().length() - pack.length(), s.length()).replaceAll("/", "."));
    			}
    			catch(Exception e){
    				throw new IOException("Exception dans la récupération dynamique de classe : "+e);
    			}
    			l.add(c);
    		}
    Bon mais attention à ne pas trop en demander
    T'as de la chance que je vienne de trouver un truc (stupide !!) qui me bloquait depuis 2 jours !!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/11/2014, 14h46
  2. Réponses: 2
    Dernier message: 09/07/2012, 12h27
  3. Réponses: 5
    Dernier message: 29/01/2008, 19h22
  4. Réponses: 5
    Dernier message: 26/07/2006, 17h01
  5. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48

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