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] Obtenir toutes les classes implémentant une interface


Sujet :

API standards et tierces Java

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut [Reflection] Obtenir toutes les classes implémentant une interface
    Bonjour à tous,

    dans un projet, j'aurais besoin de trouver la liste de toutes les classes concrètes implémentant une interface. Le but étant de lister dynamiquement toutes les classes que je pourrais instancier dans une situation donnée, afin d'en choisir une aléatoirement.

    Je ne connais pas, à priori, les noms de ces classes. Je ne connais que le package auquel elles doivent appartenir.

    Quelqu'un sait comment faire ?

    Merci !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 63
    Points : 85
    Points
    85
    Par défaut Re: [reflect]Obtenir toutes les classes implémentant une int
    Citation Envoyé par Pill_S
    dans un projet, j'aurais besoin de trouver la liste de toutes les classes concrètes implémentant une interface.
    déjà pour la première partie, y a pas de problème. une fois l'objet Class en ta possession, tu peux le tester par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //oInterface est un objet Class représentant l'interface
    oInterface.isAssignableFrom(oClass)
    la vraie question à mon avis est comment récupérer la liste des classes appartenant aux packages disponibles ou au classPath. Là, j'avoue ne pas connaitre une méthode toute faite. Une solution possible serait de parcourir toutes les repértoires et jars contenus ds le classpath

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    merci rootel, ça m'aide beaucoup moi j'étais parti sur un truc récursif sur toutes les super classes, avec utilisation de la méthode getInterfaces() etc...

    pour le problème 2, j'en fait mon affaire: j'ai défini que toutes les classes susceptibles d'être utilisées de cette manière doivent appartenir à un et un seul package, que je connais. Je fait donc une listing de tous les fichiers class (en tant qu'objets File) situés dans le système de fichiers, puis je test si les classes correspondantes implémentent mon interface...

    mais j'ai encore un piti problème: de cette manière, je récupère toutes les classes de mes packages qui implémentent l'interface voulue, mais je récupère aussi l'interface elle-même et les classes abstraites !

    Comment détecter qu'un objet Class est instanciable (pas abstrait) ??

    La méthode crade, ce serait d'instancier et de voir si ça fait une exception, mais il doit y avoir mieux non ?
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 63
    Points : 85
    Points
    85
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mod = oClass.getModifiers();
    Si la classe est abstraite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Modifier.isAbstract(mod))
    Si c une interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Modifier.isInterface(mod))
    ou en plus court

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    impec


    merci !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

Discussions similaires

  1. [D7][Infos système] Comment lister toutes les classes WMI ?
    Par phplive dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2006, 23h51
  2. Réponses: 1
    Dernier message: 06/03/2006, 14h16
  3. Réponses: 7
    Dernier message: 18/01/2006, 10h16
  4. Existe t il une doc de toutes les classes dites standard?
    Par CnD dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 27/11/2005, 11h53
  5. Réponses: 2
    Dernier message: 17/06/2005, 23h03

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