Malheureusement, Java ne fournit pas un moyen simple de lister les classes dans le JRE "natif". Cela vous laisse avec quelques options: (a) pour tout fichier JAR donné, vous pouvez lister les entrées à l'intérieur de ce fichier JAR, trouver les .class
fichiers, puis déterminer quelle classe Java chaque .class
fichier 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 remplirons classNames
la liste de toutes les classes Java contenues dans un fichier jar à /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éflexions spécialisées
Goyave
Guava en a ClassPath
depuis au moins 14,0, ce que j'ai utilisé et aimé. Une bonne chose à propos de cela 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 très appréciée. Quelques excellents exemples sont fournis sur le site Web comme ce moyen rapide de charger toutes les classes dans un package fourni par n'importe quel fichier JAR, ce 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);