2009-07-20 21 views

उत्तर

10

आप नहीं कर सकते। कक्षाएं रिमोट वाले कई अलग-अलग वर्ग लोडरों के माध्यम से आ सकती हैं।

1

ऐसा करने का कोई वैश्विक तरीका नहीं है। ऐसा कहा जा रहा है, यदि आप जानते हैं कि आपकी कक्षाएं कहां से आ रही हैं, तो आप एक जार फ़ाइल या फ़ाइल सिस्टम की निर्देशिका चल सकते हैं।

3

वहाँ 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; 
} 
+0

क्या यह जारड कक्षाओं के साथ काम करता है? –

+0

जहां तक ​​मैं यह कह सकता हूं कि यदि आपके पास जार (-1) है लेकिन डिस्कवरी (+1) के लिए क्लास फाइलों की तलाश करने के लिए एक सभ्य दिनचर्या है तो आप भी तोड़ देंगे :) –

+0

उपर्युक्त कोड न केवल यह मानता है दिए गए पैकेज से कक्षाएं स्थानीय हैं, लेकिन यह भी कि वे सभी एक ही कक्षा लोडर द्वारा लोड किए गए हैं और उन्हें पैक नहीं किया गया है। – ChssPly76

1

जावा खोज नहीं है।

अधिकतर उत्पादों में जिनके पास नए वर्गों को जोड़ने (खोजने) की क्षमता है, उनमें "प्रोग्राम एक्सटेंशन" या एक विशिष्ट निर्देशिका का वर्णन करने वाली टेक्स्ट फ़ाइल है, जहां आप कक्षाओं या जारों को वर्णित कर सकते हैं जो कि @ जेजी वर्णित चाल का उपयोग करते हैं। (यह ग्रहण करता है और किसी भी समाधान के लिए अनुशंसा की जाती है जहां उपयोगकर्ता हाथ से नया मॉड्यूल जोड़ सकता है)

+1

प्लगइन के लिए एसपीआई एपीआई को न भूलें। ये प्लगइन ढांचे के लिए एक उचित सुरुचिपूर्ण समाधान प्रदान करते हैं। – jsight

7

जेजी द्वारा पोस्ट किए गए विचार के आधार पर जार के लिए इसे हल करने का एक और पूरा तरीका यहां दिया गया है।

/** 
* 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; 
} 
+0

-1 कोई प्रलेखन या इसके बारे में संकेत भी नहीं करता है, +2 क्योंकि ऐसा लगता है कि यह वर्गपाथ स्कैन करता है और जार भी शामिल करता है! तो आप एक +1 नेट :) –

+0

(ठीक है, इसके बारे में एक संकेत था कि यह क्या करता है .. मैं इसे वापस लेता हूं)। –

+0

एक बेहतर स्पष्टीकरण के लिए एक javadoc शीर्षलेख जोड़ा गया। :) – toluju

1

उपरोक्त उत्तरों आवश्यक कार्यक्षमता की रूपरेखा तैयार करते हैं। हालांकि, इस विषय पर अधिक जानकारी here और here मिल सकती है।

संबंधित मुद्दे