Maalesef Java, sınıfları "yerel" JRE'de listelemek için kolay bir yol sağlamaz. Bu size birkaç seçenek bırakır: (a) herhangi bir JAR dosyası için, bu JAR dosyasının içindeki girişleri listeleyebilir, .classdosyaları bulabilir ve ardından her .classdosyanın hangi Java sınıfını temsil ettiğini belirleyebilirsiniz; veya (b) bunu sizin için yapan bir kitaplık kullanabilirsiniz.
Seçenek (a): JAR dosyalarını manuel olarak tarama
Bu seçenekte, classNamesadresinde bir jar dosyasının içinde bulunan tüm Java sınıflarının listesini dolduracağız /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()));
}
}
Seçenek (b): Özel yansıtma kitaplıklarını kullanma
Guava
Guava , ClassPathkullandığım ve sevdiğim en az 14.0'dan beri var. ClassPathBununla ilgili güzel bir şey , bulduğu sınıfları yüklememesidir; bu, çok sayıda sınıfı taradığınızda önemlidir.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Yansımalar
Reflections kütüphanesini kişisel olarak kullanmadım ama çok beğenilmiş görünüyor. Web sitesinde, herhangi bir JAR dosyası tarafından sağlanan bir paketteki tüm sınıfları yüklemenin bu hızlı yolu gibi bazı harika örnekler verilmiştir ve bu da uygulamanız için yararlı olabilir.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);