J'ai besoin de lire les classes contenues dans un package Java. Ces classes sont dans classpath. Je dois effectuer cette tâche directement à partir d'un programme Java. Connaissez-vous une façon simple de faire?
List<Class> classes = readClassesFrom("my.package")
java
reflection
Jørgen R
la source
la source
Réponses:
Si vous avez Spring dans votre classpath, ce qui suit le fera.
Recherchez toutes les classes d'un package annotées avec XmlRootElement:
la source
Vous pouvez utiliser le projet Reflections décrit ici
C'est assez complet et facile à utiliser.
Brève description du site Web ci-dessus:
Exemple:
la source
J'utilise celui-ci, il fonctionne avec des fichiers ou des archives jar
la source
Spring a implémenté une excellente fonction de recherche de chemin de classe dans le
PathMatchingResourcePatternResolver
. Si vous utilisez leclasspath*
préfixe:, vous pouvez trouver toutes les ressources, y compris les classes dans une hiérarchie donnée, et même les filtrer si vous le souhaitez. Ensuite , vous pouvez utiliser les enfantsAbstractTypeHierarchyTraversingFilter
,AnnotationTypeFilter
etAssignableTypeFilter
de filtrer ces ressources soit sur les annotations au niveau de la classe ou sur les interfaces qu'ils mettent en œuvre.la source
Java 1.6.0_24:
Cette solution a été testée dans l' environnement EJB .
la source
La numérotation et les réflexions utilisent une approche d'analyse de chemin de classe:
Une autre approche consiste à utiliser l' API Java Pluggable Annotation Processing pour écrire un processeur d'annotations qui collectera toutes les classes annotées au moment de la compilation et construira le fichier d'index pour une utilisation à l'exécution. Ce mécanisme est implémenté dans la bibliothèque ClassIndex :
la source
Cette fonctionnalité est toujours suspicieusement absente de l'API de réflexion Java pour autant que je sache. Vous pouvez obtenir un objet package en faisant simplement ceci:
Mais comme vous l'avez probablement remarqué, cela ne vous permettra pas de lister les classes dans ce package. Pour le moment, vous devez adopter une sorte d'approche plus orientée système de fichiers.
J'ai trouvé quelques exemples d'implémentations dans cet article
Je ne suis pas sûr à 100% que ces méthodes fonctionneront lorsque vos classes seront enterrées dans des fichiers JAR, mais j'espère que l'une d'elles le fera pour vous.
Je suis d'accord avec @skaffman ... si vous avez une autre façon de procéder, je vous recommande de le faire à la place.
la source
Le mécanisme le plus robuste pour lister toutes les classes dans un package donné est actuellement ClassGraph , car il gère le plus large éventail possible de mécanismes de spécification de chemin de classe, y compris le nouveau système de modules JPMS. (Je suis l'auteur.)
la source
eXtcos semble prometteur. Imaginez que vous vouliez trouver toutes les classes qui:
Avec eXtcos, c'est aussi simple que
la source
Bill Burke a écrit un (bel article sur la numérisation de classe), puis il a écrit Scannotation .
Hibernate a déjà écrit ceci:
CDI pourrait résoudre ce problème, mais je ne sais pas - n'a pas encore étudié complètement
.
Aussi pour les annotations:
la source
Je l'ai implémenté et cela fonctionne dans la plupart des cas. Comme il est long, je le mets dans un fichier ici .
L'idée est de trouver l'emplacement du fichier source de classe qui est disponible dans la plupart des cas (une exception connue sont les fichiers de classe JVM - pour autant que j'ai testé). Si le code se trouve dans un répertoire, parcourez tous les fichiers et repérez uniquement les fichiers de classe. Si le code se trouve dans un fichier JAR, analysez toutes les entrées.
Cette méthode ne peut être utilisée que lorsque:
Vous avez une classe qui se trouve dans le même package que vous souhaitez découvrir. Cette classe s'appelle une SeedClass. Par exemple, si vous souhaitez lister toutes les classes dans «java.io», la classe de départ peut être
java.io.File
.Vos classes sont dans un répertoire ou dans un fichier JAR, il contient des informations sur le fichier source (pas un fichier de code source, mais juste un fichier source). Autant que j'ai essayé, cela fonctionne presque à 100% sauf la classe JVM (ces classes sont livrées avec la JVM).
Votre programme doit avoir l'autorisation d'accéder à ProtectionDomain de ces classes. Si votre programme est chargé localement, il ne devrait y avoir aucun problème.
J'ai testé le programme uniquement pour mon utilisation régulière, il peut donc toujours avoir des problèmes.
J'espère que ça aide.
la source
Voici une autre option, légère modification d'une autre réponse ci-dessus / ci-dessous:
la source
À l'époque où les applets étaient monnaie courante, on pouvait avoir une URL sur le chemin de classe. Lorsque le chargeur de classe a besoin d'une classe, il recherche tous les emplacements sur le chemin de classe, y compris les ressources http. Parce que vous pouvez avoir des choses comme des URL et des répertoires sur le chemin de classe, il n'y a pas de moyen facile d'obtenir une liste définitive des classes.
Cependant, vous pouvez vous en approcher assez. Certaines des bibliothèques Spring le font maintenant. Vous pouvez obtenir tous les fichiers JAR sur le chemin de classe et les ouvrir comme des fichiers. Vous pouvez ensuite prendre cette liste de fichiers, et créer une structure de données contenant vos classes.
la source
utiliser la dépendance maven:
puis utilisez ce code:
la source
Brent - la raison pour laquelle l'association est à sens unique a à voir avec le fait que n'importe quelle classe sur n'importe quel composant de votre CLASSPATH peut se déclarer dans n'importe quel package (sauf pour java / javax). Ainsi, il n'y a tout simplement pas de mappage de TOUTES les classes dans un "package" donné parce que personne ne sait ni ne peut le savoir. Vous pouvez mettre à jour un fichier jar demain et supprimer ou ajouter des classes. C'est comme essayer d'obtenir une liste de toutes les personnes nommées John / Jon / Johan dans tous les pays du monde - aucun de nous n'est omniscient, donc aucun de nous n'aura jamais la bonne réponse.
la source