我想從單獨的Java項目中獲取所有軟件包名稱,如何在Java中使用反射來完成此操作?使用java反射獲取軟件包名稱
我已經將項目導入到我的構建路徑中,並嘗試使用下面的代碼來獲取軟件包名稱。
Package[] pack = Package.getPackages();
編輯:我不使用jar文件,我剛纔導入的項目,因爲它會在同一目錄。我只需要創建的包,特別是以特定目錄開頭的包。
我想從單獨的Java項目中獲取所有軟件包名稱,如何在Java中使用反射來完成此操作?使用java反射獲取軟件包名稱
我已經將項目導入到我的構建路徑中,並嘗試使用下面的代碼來獲取軟件包名稱。
Package[] pack = Package.getPackages();
編輯:我不使用jar文件,我剛纔導入的項目,因爲它會在同一目錄。我只需要創建的包,特別是以特定目錄開頭的包。
只使用getPackages()
,你實在無法知道庫中的每個包名,因爲它只會列出classloader已知的包名。這意味着如果一個類尚未從特定包中加載,那麼它將不在列表中。
使用壓縮文件處理例程打開jar文件,並按目錄名讀出軟件包。使用這種技術,您將發現所有軟件包名稱,即使那些尚未「使用」的軟件包名稱。基本上,包含.class
文件的任何路徑都是「包名稱」。
----編輯爲進一步的細節顯示沒有被使用的JAR文件---
既然你不使用JAR文件(爲什麼不呢?他們真的很不錯!),你將有掃描目錄。要「查找」目錄,您需要切斷課程路徑。獲取類路徑的方法是:
String classpath = System.getProperty("java.class.path", null);
那麼你就具有.class
文件中的每一個它「出發點」下一個搜索的所有目錄。一旦你擁有了所有這些,你擁有所有的軟件包。除非你能以某種方式保證類加載器已經加載了所有類(通常不會),否則不可能通過詢問類加載器來知道所有的包。
這不起作用。詳情請參閱編輯。 – Colin747
查看更新,並考慮在jar文件中打包您的類。 –
只要你不需要空包,這樣的事情應該工作:
/**
* 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);
*「我想從一個單獨的Java項目中的所有包的名字,我會怎麼做這在Java中最好使用反射?」 *什麼是最終用戶從所有這些惡作劇得到什麼?您想要提供哪些**應用程序功能? –