दुर्भाग्य से, जावा "देशी" JRE में कक्षाएं सूचीबद्ध करने का एक आसान तरीका प्रदान नहीं करता है। यह आपको कुछ विकल्पों के साथ छोड़ देता है: (ए) किसी भी दिए गए JAR फ़ाइल के लिए, आप उस JAR फ़ाइल के अंदर की प्रविष्टियों को सूचीबद्ध कर सकते हैं, .class
फ़ाइलों को ढूँढ सकते हैं, और फिर निर्धारित कर सकते हैं कि कौन-सी जावा क्लास प्रत्येक .class
फ़ाइल का प्रतिनिधित्व करती है; या (बी) आप एक पुस्तकालय का उपयोग कर सकते हैं जो आपके लिए ऐसा करता है।
विकल्प (ए): मैन्युअल रूप से जार फ़ाइलों को स्कैन करना
इस विकल्प में, हम classNames
एक जार फ़ाइल के अंदर निहित सभी जावा वर्गों की सूची से भरेंगे /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()));
}
}
विकल्प (बी): विशेष प्रतिबिंब पुस्तकालयों का उपयोग करना
अमरूद
अमरूदClassPath
कम से कम 14.0 से पड़ा है , जिसे मैंने इस्तेमाल किया है और पसंद किया है। इसके बारे ClassPath
में एक अच्छी बात यह है कि यह उन कक्षाओं को लोड नहीं करता है जो इसे पाता है, जो तब महत्वपूर्ण होता है जब आप बड़ी संख्या में कक्षाओं के लिए स्कैन कर रहे होते हैं।
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
कुछ विचार
मैंने व्यक्तिगत रूप से रिफ्लेक्शंस लाइब्रेरी का उपयोग नहीं किया है , लेकिन यह अच्छी तरह से पसंद किया गया है। वेबसाइट पर कुछ बेहतरीन उदाहरण दिए गए हैं जैसे कि किसी भी JAR फ़ाइल द्वारा दिए गए पैकेज में सभी कक्षाओं को लोड करने का यह त्वरित तरीका , जो आपके आवेदन के लिए भी उपयोगी हो सकता है।
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);