मैं पैकेज के भीतर सभी कक्षाएं कैसे प्राप्त करूं?जावा पैकेज आत्मनिरीक्षण
उत्तर
आप नहीं कर सकते। कक्षाएं रिमोट वाले कई अलग-अलग वर्ग लोडरों के माध्यम से आ सकती हैं।
ऐसा करने का कोई वैश्विक तरीका नहीं है। ऐसा कहा जा रहा है, यदि आप जानते हैं कि आपकी कक्षाएं कहां से आ रही हैं, तो आप एक जार फ़ाइल या फ़ाइल सिस्टम की निर्देशिका चल सकते हैं।
वहाँ here से एक टुकड़ा है कि, वास्तव में आप क्या चाहते हैं करता कक्षाएं संभालने है पाया जा सकता है स्थानीय स्तर पर:
private static Class[] getClasses(String packageName)
throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
assert classLoader != null;
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class> classes = new ArrayList<Class>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes.toArray(new Class[classes.size()]);
}
private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class> classes = new ArrayList<Class>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
क्या यह जारड कक्षाओं के साथ काम करता है? –
जहां तक मैं यह कह सकता हूं कि यदि आपके पास जार (-1) है लेकिन डिस्कवरी (+1) के लिए क्लास फाइलों की तलाश करने के लिए एक सभ्य दिनचर्या है तो आप भी तोड़ देंगे :) –
उपर्युक्त कोड न केवल यह मानता है दिए गए पैकेज से कक्षाएं स्थानीय हैं, लेकिन यह भी कि वे सभी एक ही कक्षा लोडर द्वारा लोड किए गए हैं और उन्हें पैक नहीं किया गया है। – ChssPly76
जावा खोज नहीं है।
अधिकतर उत्पादों में जिनके पास नए वर्गों को जोड़ने (खोजने) की क्षमता है, उनमें "प्रोग्राम एक्सटेंशन" या एक विशिष्ट निर्देशिका का वर्णन करने वाली टेक्स्ट फ़ाइल है, जहां आप कक्षाओं या जारों को वर्णित कर सकते हैं जो कि @ जेजी वर्णित चाल का उपयोग करते हैं। (यह ग्रहण करता है और किसी भी समाधान के लिए अनुशंसा की जाती है जहां उपयोगकर्ता हाथ से नया मॉड्यूल जोड़ सकता है)
प्लगइन के लिए एसपीआई एपीआई को न भूलें। ये प्लगइन ढांचे के लिए एक उचित सुरुचिपूर्ण समाधान प्रदान करते हैं। – jsight
जेजी द्वारा पोस्ट किए गए विचार के आधार पर जार के लिए इसे हल करने का एक और पूरा तरीका यहां दिया गया है।
/**
* Scans all classloaders for the current thread for loaded jars, and then scans
* each jar for the package name in question, listing all classes directly under
* the package name in question. Assumes directory structure in jar file and class
* package naming follow java conventions (i.e. com.example.test.MyTest would be in
* /com/example/test/MyTest.class)
*/
public Collection<Class> getClassesForPackage(String packageName) throws Exception {
String packagePath = packageName.replace(".", "/");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Set<URL> jarUrls = new HashSet<URL>();
while (classLoader != null) {
if (classLoader instanceof URLClassLoader)
for (URL url : ((URLClassLoader) classLoader).getURLs())
if (url.getFile().endsWith(".jar") // may want better way to detect jar files
jarUrls.add(url);
classLoader = classLoader.getParent();
}
Set<Class> classes = new HashSet<Class>();
for (URL url : jarUrls) {
JarInputStream stream = new JarInputStream(url.openStream()); // may want better way to open url connections
JarEntry entry = stream.getNextJarEntry();
while (entry != null) {
String name = entry.getName();
int i = name.lastIndexOf("/");
if (i > 0 && name.endsWith(".class") && name.substring(0, i).equals(packagePath))
classes.add(Class.forName(name.substring(0, name.length() - 6).replace("/", ".")));
entry = stream.getNextJarEntry();
}
stream.close();
}
return classes;
}
-1 कोई प्रलेखन या इसके बारे में संकेत भी नहीं करता है, +2 क्योंकि ऐसा लगता है कि यह वर्गपाथ स्कैन करता है और जार भी शामिल करता है! तो आप एक +1 नेट :) –
(ठीक है, इसके बारे में एक संकेत था कि यह क्या करता है .. मैं इसे वापस लेता हूं)। –
एक बेहतर स्पष्टीकरण के लिए एक javadoc शीर्षलेख जोड़ा गया। :) – toluju
- 1. आत्मनिरीक्षण
- 2. पायथन: व्यावहारिक आत्मनिरीक्षण
- 3. क्लोजर में आत्मनिरीक्षण
- 4. जावा पैकेज
- 5. जावा पैकेज?
- 6. सामान्य लिस्प में कक्षा आत्मनिरीक्षण
- 7. Django-South आत्मनिरीक्षण नियम
- 8. कार्यात्मक प्रोग्रामिंग भाषा आत्मनिरीक्षण
- 9. जावा पैकेज नामकरण सम्मेलनों
- 10. जावा सांख्यिकीय पैकेज
- 11. पैकेज बनाम जावा प्रतिबिंब
- 12. जावैक्स बनाम जावा पैकेज
- 13. जावा में पैकेज
- 14. मेवेन + जावा पैकेज घोषणा
- 15. जावास्क्रिप्ट ऑब्जेक्ट आत्मनिरीक्षण कैसे करें?
- 16. घोषणात्मक कक्षाओं के SQLAlchemy आत्मनिरीक्षण
- 17. डी: फ़ंक्शन पैरामीटर नाम आत्मनिरीक्षण
- 18. जावा पैकेज नाम सम्मेलन विफलता
- 19. जावा पैकेज बनाम ग # विधानसभाओं
- 20. जावा पैकेज बनाम सी ++ पुस्तकालय
- 21. स्कैला आयात जावा पैकेज कॉम
- 22. बाहरी जावा पैकेज स्थापित करना
- 23. जावा पैकेज कॉम और संगठन
- 24. ओरेकल पैकेज और जावा पैकेज के बीच मैपिंग
- 25. मैं SQL सर्वर पर आत्मनिरीक्षण कैसे करूं?
- 26. win32com मॉड्यूल/पायथनॉम मॉड्यूल का आत्मनिरीक्षण
- 27. रूबी में चीजों का आत्मनिरीक्षण कैसे करूं?
- 28. पायथन जोर - विफलता के आत्मनिरीक्षण में सुधार?
- 29. "आत्मनिरीक्षण-आधारित कोड पूर्णता" क्या है?
- 30. पैकेज?
यह भी ध्यान दें [यह पोस्ट] (http://stackoverflow.com/q/520328/1005481)। –