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 .class
Dateien suchen und dann bestimmen, welche Java-Klasse jede .class
Datei 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 classNames
die 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 ClassPath
seit mindestens 14.0, die ich benutzt und gemocht habe. Das Schöne daran ClassPath
ist, 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);