Leider bietet Java keine einfache Möglichkeit, Klassen in der "nativen" JRE aufzulisten. Damit haben Sie einige Möglichkeiten: (a) Für jede gegebene JAR-Datei können Sie die Einträge in dieser JAR-Datei auflisten, die .classDateien suchen und dann bestimmen, welche Java-Klasse jede .classDatei darstellt; oder (b) Sie können eine Bibliothek verwenden, die dies für Sie erledigt.
Option (a): Manuelles Scannen von JAR-Dateien
In dieser Option füllen wir classNamesdie Liste aller Java-Klassen aus, die in einer JAR-Datei unter enthalten sind /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): Verwendung spezialisierter Reflexionsbibliotheken
Guave
Guave hat ClassPathseit mindestens 14.0, die ich benutzt und gemocht habe. Das Schöne daran ClassPathist, dass die gefundenen Klassen nicht geladen werden. Dies ist wichtig, wenn Sie nach einer großen Anzahl von Klassen suchen.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Reflexionen
Ich habe die Reflections-Bibliothek nicht persönlich benutzt , aber sie scheint sehr beliebt zu sein. Auf der Website finden Sie einige gute Beispiele wie diese schnelle Möglichkeit, alle Klassen in ein Paket zu laden, das von einer JAR-Datei bereitgestellt wird. Dies kann auch für Ihre Anwendung nützlich sein.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);