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 .classfichiers, puis déterminer quelle classe Java chaque .classfichier 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 classNamesla 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 ClassPathdepuis au moins 14,0, ce que j'ai utilisé et aimé. Une bonne chose à propos de cela ClassPathest 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);