দুর্ভাগ্যক্রমে, জাভা "নেটিভ" জেআরইতে ক্লাস তালিকা করার কোনও সহজ উপায় সরবরাহ করে না। এটি আপনাকে বেশ কয়েকটি বিকল্পের সাথে ছেড়ে দেয়: (ক) প্রদত্ত যে কোনও জেআর ফাইলের জন্য, আপনি সেই জেআর ফাইলের ভিতরে থাকা তালিকাগুলি তালিকাভুক্ত করতে পারেন, ফাইলগুলি সন্ধান করতে পারেন .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
হ'ল এটি খুঁজে পাওয়া ক্লাসগুলি লোড করে না, আপনি যখন প্রচুর ক্লাসের জন্য স্ক্যান করছেন তখন তা গুরুত্বপূর্ণ important
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
ভাবনা
আমি ব্যক্তিগতভাবে প্রতিচ্ছবি গ্রন্থাগারটি ব্যবহার করি নি , তবে এটি ভাল পছন্দ হয়েছে বলে মনে হচ্ছে। কোনও জেআর ফাইল দ্বারা সরবরাহিত প্যাকেজে সমস্ত ক্লাস লোড করার জন্য এই দুর্দান্ত উপায়ে ওয়েবসাইটটিতে কয়েকটি দুর্দান্ত উদাহরণ সরবরাহ করা হয়েছে, এটি আপনার অ্যাপ্লিকেশনের জন্যও কার্যকর হতে পারে।
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);