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, .class
dosyaları bulabilir ve ardından her .class
dosyanı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, classNames
adresinde 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 , ClassPath
kullandığım ve sevdiğim en az 14.0'dan beri var. ClassPath
Bununla 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);