|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() ![]() Inscription : décembre 2002 Messages : 1 423 ![]() |
Bonjour,
Quel est selon vous le meilleur moyen de trouver l'ensemble des class implémentant une interface ? La seule chose connu serait que ces classe se trouvent dans un package bien spécique. Voici un peu ce que je cherche à faire : Code :
__________________
Reportage d'Arte sur Linux |
||
|
|
00
|
|
|
#2 |
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Salut,
Il n'y a aucun moyen de faire cela via la reflection : ce serait bien trop lourd car il faudrait charger toutes les classes du CLASSPATH... Si ces classes ne sont présente que dans un seul et unique package à la rigueur tu pourrais faire cela "à la main" en chargeant les classes une à une mais ce n'est pas pratique (on ne peut même pas connaitre toutes les classes d'un même package). Pourquoi as-tu besoin de cela ? a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
|
00
|
|
|
#3 |
|
Membre Expert
![]() ![]() Inscription : décembre 2002 Messages : 1 423 ![]() |
Merci,
J'ai déjà fait ce genre de chose. En fait je parcourais tous les fichier classe d'un répertoire, je chargeait la classe puis je vérifiait qu'elle implémentaient la classe mère. Ca fonctionne mais mon code n'est pas top je trouve et dans certains cas ça ne fonctionne pas. J'utilise ce chargement dynamique pour avoir un système de plugin dans mon application. J'aurais espéré que les nouvelles version de java me facilite la tâche
__________________
Reportage d'Arte sur Linux |
|
|
00
|
|
|
#4 | ||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Avec Java 6 il y a la notion de service qui pourrait être une aternative au scan des répertoires...
Un "service" correspond à une interface (ou une classe abstraite), et les "service provider" sont des implémentations de cette interface (ou de cette classe abstraite). Toutes les implémentations doivent être déclarées dans un fichier spécifique dans le répertoire META-INF/services... A partir de là, la classe ServiceLoader peut te retrouver toutes les implémentation ainsi déclarées... Par exemple, tu as une interface com.maboite.MonInterface, et trois implémentation spécifique com.maboite.MonImpl, com.monautreboite.MaClasse et com.monautreboite.souspackage.MonAutreImpl Tu devras donc avoir un fichier META-INF/services/com.maboite.MonInterface qui contiendra les lignes suivantes : Code X :
Ensuite, il ne te reste plus qu'à utiliser la méthode load() qui analysera ce fichier et chargera ces classes : Code :
Bien sûr chacun de tes jar ou de tes répertoires du classpath peuvent avoir un de ces fichiers, et ils seront tous lus... Tu ne dois surement pas utiliser Java 6 mais ce n'est pas vraiment très compliqué à codé : il suffit d'utiliser la méthode getResources(java.lang.String) du ClassLoader pour retrouver tous les fichiers du même nom dans les divers éléments du classpath... ensuite ce n'est que lecture de fichier + reflection simple... Je dois avoir un code de ce genre quelque part... si je le retrouve je le posterais... a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : décembre 2002 Messages : 1 423 ![]() |
Ca a l'aire trop fort cette histoire de service ! Il sort quand Java6 ?
Si je comprend bien il va falloire que je parcours encore mes pakages merci adiGuba
__________________
Reportage d'Arte sur Linux |
|
|
00
|
|
|
#6 | ||||
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 460 ![]() |
Citation:
Citation:
Cela pourrait donner ceci (code Java 5.0 à adapter au cas où) : Code :
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||
|
00
|
|
|
#7 |
|
Membre Expert
![]() ![]() Inscription : décembre 2002 Messages : 1 423 ![]() |
Ouha
__________________
Reportage d'Arte sur Linux |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Inscription : décembre 2002 Messages : 1 423 ![]() |
Merci beaucoup adiGuba ça fonctionne
__________________
Reportage d'Arte sur Linux |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com