Infelizmente, o Java não fornece uma maneira fácil de listar classes no JRE "nativo". Isso deixa você com algumas opções: (a) para qualquer arquivo JAR fornecido, você pode listar as entradas dentro desse arquivo JAR, localizar os .class
arquivos e determinar qual classe Java cada .class
arquivo representa; ou (b) você pode usar uma biblioteca que faça isso para você.
Opção (a): Verificar arquivos JAR manualmente
Nesta opção, preencheremos classNames
com a lista de todas as classes Java contidas em um arquivo jar em /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()));
}
}
Opção (b): Usando bibliotecas de reflexões especializadas
Goiaba
A goiaba tem ClassPath
desde pelo menos 14.0, que usei e gostei. Uma coisa boa ClassPath
é que ele não carrega as classes que encontra, o que é importante quando você está procurando por um grande número de classes.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Reflexões
Eu não usei pessoalmente a biblioteca Reflections , mas parece bem quista. Alguns ótimos exemplos são fornecidos no site, como esta maneira rápida de carregar todas as classes em um pacote fornecido por qualquer arquivo JAR, que também pode ser útil para seu aplicativo.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);