Malheureusement, Java ne fournit pas un moyen facile de lister les classes dans le JRE "natif". Cela vous laisse deux options : (a) pour un fichier JAR donné, vous pouvez lister les entrées à l'intérieur de ce fichier JAR, trouver le fichier .class
et ensuite déterminer quelle classe Java chaque .class
représente ; ou (b) vous pouvez utiliser une bibliothèque qui le fait pour vous.
Option (a) : Analyse manuelle des fichiers JAR
Dans cette option, nous allons remplir classNames
avec la liste de toutes les classes Java contenues dans un fichier jar à l'adresse suivante /path/to/jar/file.jar
.
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
// This ZipEntry represents a class. Now, what class does it represent?
String className = entry.getName().replace('/', '.'); // including ".class"
classNames.add(className.substring(0, className.length() - ".class".length()));
}
}
Option (b) : Utilisation de bibliothèques de réflexion spécialisées
Goyave
Goyave a eu ClassPath
depuis au moins 14.0, que j'ai utilisé et apprécié. Une bonne chose à propos de ClassPath
est qu'il ne charge pas les classes qu'il trouve, ce qui est important lorsque vous recherchez un grand nombre de classes.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Réflexions
Je n'ai pas personnellement utilisé la bibliothèque Reflections mais elle semble bien appréciée. De très bons exemples sont fournis sur le site web, comme cette manière rapide de charger toutes les classes d'un paquetage fourni par tout JAR, qui peut également être utile pour votre application.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
0 votes
Utilisez-vous un IDE ? Il s'affichera automatiquement si vous en utilisez un.
0 votes
J'utilise Eclipse, mais j'ai besoin de faire cela avec du code.
0 votes
@LuiggiMendoza - Le duplicata potentiel a des réponses avec des exemples ainsi que des ressources pour la documentation. La recherche d'un de ces noms de classe + exemple donnera plusieurs résultats utiles.
0 votes
@Alias le double éventuel indique comment trouver et obtenir un fichier à partir d'un jar, alors que la question porte sur l'obtention des noms de classes à l'intérieur d'un jar (éventuellement les classes de tous les paquets qu'il contient). Le lien dans la réponse d'ErikKaju pointe vers une solution possible utilisant
JarInputStream
yJarEntry
que je ne peux trouver dans aucune réponse de votre lien référencé.