Sfortunatamente, Java non fornisce un modo semplice per elencare le classi nel JRE "nativo". Ciò ti lascia con un paio di opzioni: (a) per ogni dato file JAR, puoi elencare le voci all'interno di quel file JAR, trovare i .class
file e quindi determinare quale classe Java ciascuno.class
rappresenta file; o (b) puoi usare una libreria che fa questo per te.
Opzione (a): scansione manuale dei file JAR
In questa opzione, riempiremo classNames
con l'elenco di tutte le classi Java contenute in un file jar in /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()));
}
}
Opzione (b): utilizzo di librerie di riflessioni specializzate
Guaiava
Guava ha ClassPath
almeno 14.0, che ho usato e mi è piaciuto. Una cosa bella ClassPath
è che non carica le classi che trova, il che è importante quando si esegue la scansione di un gran numero di classi.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Riflessi
Non ho usato personalmente la libreria Reflections , ma mi sembra molto apprezzata. Alcuni ottimi esempi sono forniti sul sito web come questo modo rapido per caricare tutte le classi in un pacchetto fornito da qualsiasi file JAR, che può anche essere utile per la tua applicazione.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);