2012-12-19 22 views
11

मैं एक जावा ऐप बना रहा हूं जिसमें कई अलग-अलग पैकेज हैं। मैं प्रोग्रामेटिक रूप से यह बताने में सक्षम होना चाहता हूं कि ऐप में कौन से पैकेज मौजूद हैं जो एक विशिष्ट प्री-फ़िक्स से शुरू होते हैं। जावा प्रतिबिंब एपीआई के साथ ऐसा करने के लिए वैसे भी है? मुझे इस तरह कुछ भी प्रतिबिंब apis से संबंधित नहीं देखा था।जावा प्रतिबिंब - पैकेजों की सूची प्राप्त करें

उदाहरण:

com.app.controls.text 
com.app.controls.picker 
com.app.controls.date 
etc 

मैं उपसर्ग "com.app.controls" और समझ है कि एक नए पैकेज भविष्य में एकीकृत हो सकता है जानने के द्वारा इन सब की गणना करना चाहते हैं।

धन्यवाद!

उत्तर

16

आप Package.getPackages() का उपयोग कर ऐसा कर सकते हैं, जो वर्तमान क्लास लोडर को ज्ञात सभी संकुलों की एक सरणी देता है। आपको सरणी के माध्यम से मैन्युअल रूप से लूप करना होगा और getName() का उपयोग करके उचित उपसर्ग वाले लोगों को ढूंढना होगा।

public List<String> findPackageNamesStartingWith(String prefix) { 
    List<String> result = new ArrayList<>(); 
    for(Package p : Package.getPackages()) { 
     if (p.getName().startsWith(prefix)) { 
      result.add(p.getName()); 
     } 
    } 
    return result; 
} 

ध्यान दें कि यह तकनीक केवल संकुल वर्तमान वर्ग लोडर में परिभाषित वापस आ जाएगी:

यहां एक त्वरित उदाहरण है। आप एक अलग वर्ग लोडर से संकुल की जरूरत है, वहाँ कुछ विकल्प हैं: ताकि आपके प्रोग्राम है जो वर्ग लोडर अंदर से ऊपर कोड चला सकते हैं

  1. चीजें व्यवस्थित करें। इसके लिए आपके कोड बेस पर एक निश्चित संगठन की आवश्यकता होती है, जो संभव हो सकता है या नहीं भी हो सकता है।

  2. उपयुक्त वर्ग लोडर पर (सामान्य रूप से संरक्षित) विधि getPackages() पर कॉल करने के लिए प्रतिबिंब का उपयोग करें। यदि प्रोग्राम सुरक्षा प्रबंधक के अधीन चल रहा है तो यह काम नहीं करेगा।

+0

दुर्भाग्य से संकुल वर्तमान वर्ग लोडर के लिए नहीं जाना जाता है। क्या कोई और संभावित तरीका है? –

+0

शायद नहीं, उन्हें स्पष्ट रूप से सूचीबद्ध करने के अलावा। –

+0

@ डेरेक गेहहार्ड: दो संभावनाएं दिमाग में आईं। मैंने उन्हें जवाब में जोड़ा है। –

0

पैकेज प्रतिबिंब के पीओवी से मुश्किल से मौजूद हैं, वे क्लासलोडर को छोड़कर बहुत अदृश्य हैं।

0

Sean's answer पर और प्रतिबिंब का उपयोग संकुल की एक सूची प्राप्त करने के आधार पर - संभवतः खाली लोगों की अनदेखी:

/** 
* Finds all package names starting with prefix 
* @return Set of package names 
*/ 
public Set<String> findAllPackagesStartingWith(String prefix) { 
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); 
    classLoadersList.add(ClasspathHelper.contextClassLoader()); 
    classLoadersList.add(ClasspathHelper.staticClassLoader()); 
    Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setScanners(new SubTypesScanner(false), new ResourcesScanner()) 
      .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) 
      .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("my.base.package")))); 
    Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class); 

    Set<String> packageNameSet = new TreeSet<String>(); 
    for (Class classInstance : classes) { 
     String packageName = classInstance.getPackage().getName(); 
     if (packageName.startsWith(prefix)) { 
      packageNameSet.add(packageName); 
     } 
    } 
    return packageNameSet; 
} 
+0

उप-पैकेज के लिए काम नहीं कर रहा है – cyril

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