2012-08-29 48 views
3

我想從單獨的Java項目中獲取所有軟件包名稱,如何在Java中使用反射來完成此操作?使用java反射獲取軟件包名稱

我已經將項目導入到我的構建路徑中,並嘗試使用下面的代碼來獲取軟件包名稱。

Package[] pack = Package.getPackages();

編輯:我不使用jar文件,我剛纔導入的項目,因爲它會在同一目錄。我只需要創建的包,特別是以特定目錄開頭的包。

+0

*「我想從一個單獨的Java項目中的所有包的名字,我會怎麼做這在Java中最好使用反射?」 *什麼是最終用戶從所有這些惡作劇得到什麼?您想要提供哪些**應用程序功能? –

回答

6

只使用getPackages(),你實在無法知道庫中的每個包名,因爲它只會列出classloader已知的包名。這意味着如果一個類尚未從特定包中加載,那麼它將不在列表中。

使用壓縮文件處理例程打開jar文件,並按目錄名讀出軟件包。使用這種技術,您將發現所有軟件包名稱,即使那些尚未「使用」的軟件包名稱。基本上,包含.class文件的任何路徑都是「包名稱」。

----編輯爲進一步的細節顯示沒有被使用的JAR文件---

既然你不使用JAR文件(爲什麼不呢?他們真的很不錯!),你將有掃描目錄。要「查找」目錄,您需要切斷課程路徑。獲取類路徑的方法是:

String classpath = System.getProperty("java.class.path", null); 

那麼你就具有.class文件中的每一個它「出發點」下一個搜索的所有目錄。一旦你擁有了所有這些,你擁有所有的軟件包。除非你能以某種方式保證類加載器已經加載了所有類(通常不會),否則不可能通過詢問類加載器來知道所有的包。

+0

這不起作用。詳情請參閱編輯。 – Colin747

+0

查看更新,並考慮在jar文件中打包您的類。 –

0

只要你不需要空包,這樣的事情應該工作:

/** 
* Finds all package names 
* @return Set of package names 
*/ 
public Set<String> findAllPackages() { 
    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) { 
     packageNameSet.add(classInstance.getPackage().getName()); 
    } 
    return packageNameSet; 
} 

它發現的所有類,通過他們循環,並獲得存儲在一組,以避免重複包名。

不幸的是,我們不能只使用正常的Reflections對象下面的代碼,而不指定自定義配置來允許對象掃描。

Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);