124 votes

Trouver les classes Java implémentant une interface

Il y a quelques temps, je suis tombé sur un morceau de code, qui a utilisé un morceau de Java standard de la fonctionnalité localiser les classes qui ont mis en œuvre une interface donnée. Je sais que les fonctions ont été cachés dans un non-lieu logique, mais ils pourraient être utilisés pour d'autres classes comme le nom du paquet implicite. À l'époque, je n'avais pas besoin d'elle, donc je l'avais oublié, mais maintenant je le fais, et je n'arrive pas à trouver les fonctions de nouveau. Où puis ces fonctions?

Edit: je ne suis pas à la recherche de toute IDE de fonctions ou de quoi que ce soit, mais plutôt quelque chose qui peut être exécuté à l'intérieur de l'application Java.

64voto

Brian Clapper Points 11222

Y a quelques temps, j'ai mis en place un package pour faire ce que vous voulez, et plus encore. (J'en avais besoin pour un utilitaire que j'écrivais). Il utilise l' ASM bibliothèque. Vous pouvez utiliser la réflexion, mais l'ASM s'est avéré plus performant.

J'ai mis mon colis dans une bibliothèque open source que j'ai sur mon site web. La bibliothèque est ici: http://software.clapper.org/javautil/. Vous voulez commencer avec le avec ClassFinder classe.

L'utilitaire que j'ai écrit pour un lecteur de flux RSS que j'utilise encore tous les jours, de sorte que le code ne tendent à s'exercer. J'utilise ClassFinder à l'appui d'une API de plug-in dans le lecteur de flux RSS; au démarrage, il se regarde dans un couple répertoire des arbres pour les bocaux et classe les fichiers contenant les classes qui implémentent une interface particulière. C'est beaucoup plus rapide que vous pourriez vous attendre.

La bibliothèque est sous licence BSD, de sorte que vous pouvez en toute sécurité le bundle avec votre code. Source est disponible.

Si c'est utile pour vous, aider vous-même.

Mise à jour: Si vous êtes en utilisant Scala, vous pourriez trouver cette bibliothèque pour être plus Scala-friendly.

52voto

Nick Robson Points 171

Printemps peut faire pour vous...

N.-B. Le TypeFilter est important si vous voulez des résultats corrects ! Vous pouvez également utiliser filtres d’exclusion ici au lieu de cela.

Le Scanner se trouvent dans le bocal de printemps-context, le registre en printemps-haricots, que le type de filtre est au printemps-coeur.

31voto

robertvoliva Points 512

J’aime beaucoup la bibliothèque de réflexions pour y parvenir :

http://code.google.com/p/Reflections/

Il offre beaucoup de différents types de scanners (getTypesAnnotatedWith, getSubTypesOf, etc.), et il est simple d’écrire ou de prolonger votre propre.

23voto

erickson Points 127945

Le code dont vous parlez ressemble ServiceLoader, qui a été introduit dans la version 6 de Java à l'appui d'une fonctionnalité qui a été défini depuis Java 1.3 ou version antérieure. Pour des raisons de performances, c'est l'approche recommandée pour trouver des implémentations d'interface lors de l'exécution; si vous avez besoin de support pour cela dans une ancienne version de Java, j'espère que vous trouverez mon œuvre utile.

Il ya un couple de mises en œuvre de ce dans les versions antérieures de Java, mais dans les voyages au Soleil, pas dans l'API de base (je pense qu'il y a certaines classes internes à ImageIO que cela). Comme le code est simple, je vous recommande de fournir votre propre mise en œuvre, plutôt que de compter sur la non-standard code du Soleil qui est sujet à changement.

13voto

Adam Gent Points 15055

Paquet Niveau Des Annotations

Je sais que cette question a déjà été répondu il y a longtemps, mais une autre solution à ce problème est d'utiliser l'ensemble des Annotations.

Alors que son assez difficile d'aller trouver toutes les classes dans la JVM, il est assez facile de naviguer dans la hiérarchie des paquets.

Package[] ps = Package.getPackages();
for (Package p : ps) {
  MyAno a = p.getAnnotation(MyAno.class)
  // Recursively descend
}

Puis faites votre annotation ont un argument d'un tableau de Classe. Puis dans votre package-info.java pour un paquet particulier de mettre la MyAno.

Je vais ajouter plus de détails (code) si les gens sont intéressés, mais plus probablement d'avoir l'idée.

MetaInf Service De Chargeur

Pour ajouter à @erickson de réponse, vous pouvez également utiliser le service de chargeur d'approche. Kohsuke nous a un super moyen de produire de l'requis META-INF choses dont vous avez besoin pour le service de chargeur d'approche:

http://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X