Sayangnya, Java tidak menyediakan cara mudah untuk membuat daftar kelas di JRE "asli". Itu membuat Anda memiliki beberapa opsi: (a) untuk file JAR tertentu, Anda dapat membuat daftar entri di dalam file JAR tersebut, menemukan .class
file, dan kemudian menentukan kelas Java mana yang .class
diwakili oleh setiap file; atau (b) Anda dapat menggunakan perpustakaan yang melakukan ini untuk Anda.
Opsi (a): Memindai file JAR secara manual
Dalam opsi ini, kami akan mengisi classNames
dengan daftar semua kelas Java yang ada di dalam file jar di /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()));
}
}
Opsi (b): Menggunakan pustaka refleksi khusus
Jambu biji
Jambu biji telah memiliki ClassPath
setidaknya 14.0, yang telah saya gunakan dan sukai. Satu hal yang menyenangkan ClassPath
adalah bahwa ia tidak memuat kelas yang ditemukannya, yang penting saat Anda memindai sejumlah besar kelas.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Refleksi
Saya pribadi belum pernah menggunakan perpustakaan Refleksi , tetapi tampaknya sangat disukai. Beberapa contoh bagus disediakan di situs web seperti cara cepat ini untuk memuat semua kelas dalam paket yang disediakan oleh file JAR apa pun , yang mungkin juga berguna untuk aplikasi Anda.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);