Bonjour,
Je cherche et récupérer la liste des classes, depuis un jar, qui implémentent une interface bien précise. Est-ce possible? y-a-t-il une méthode directe pour le faire?
Merci d'avance.
Bonjour,
Je cherche et récupérer la liste des classes, depuis un jar, qui implémentent une interface bien précise. Est-ce possible? y-a-t-il une méthode directe pour le faire?
Merci d'avance.
Bonjour,
est-ce un besoin ponctuel ou est-ce que tu aurais besoin de faire ça dans ton appli?
Si tu veux faire ça ponctuellement, l'IDE (Eclipse par exemple) le fait très bien.
Si tu souhaites le faire dynamiquement, c'est plus compliqué.
Tu dois bien y arriver en récupérant les classes depuis les entrées de ton jar, mais c'est plutôt artisanal et cela nécessite que les classes soient dans un jar (ce n'est pas toujours le cas) et que tu saches où se trouve le jar.
Quel est le besoin qui se cache derrière tout ça?
Si c'est pour un soucis de modularité, il existe d'autres solutions.
Oui j'ai besoin de faire ça dynamiquement,
Au fait je cherche à récupérer une classe bien précise qui implémente l'interface EntryPoint (GWT), et pour les classes ils seront dans un jar bien sûr qui sera le point d'entrée de l'application.
Je ne connais pas GWT, mais de ce que j'ai trouvé sur EntryPoint, la solution du ServiceLoader devrait convenir.
L'idée est de déclarer dans un fichier com.google.gwt.core.client.EntryPoint les classes du JAR qui implémentent l'interface, de mettre ce fichier dans le dossier META-INF/services de ton JAR et de faire un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for (EntryPoint entry : ServiceLoader.load(EntryPoint.class) { entry.onModuleLoad(); }
"scanner" le jar est une opération couteuse. D'abord par ce que ca nécessite de charger et d'instancier toutes les classes présentes dans le jar, alors que bien souvent, une partie des classes d'une librairie ne sont jamais utilisées par l'application, ce qui augmente donc inutilement l'empreinte mémoire.
Pour ce besoin, effectivement, l'utilisation comme Service avec ServiceLoader me semble le plus approprié.
je n'aime en général pas l'idée du scann, car caveux dire que des classes qui n'ont pas été prévues pour être utilisée (classes abstraites, inner class et anonymous class de soutiens) qui implémentent l'interface se retrouvent aussi scannées :/
Partager