[英]Get package names using java reflections
我想從一個單獨的Java項目中獲取所有包名稱,我最好如何使用反射在Java中執行此操作?
我已將項目導入到構建路徑中,並且我嘗試使用下面的代碼來獲取包名稱。
Package[] pack = Package.getPackages();
編輯:我沒有使用jar文件,我剛剛導入了項目,因為它將在同一個目錄中。 我只需要我創建的包,特別是以某個目錄開頭的包。
你真的不能通過使用getPackages()
知道庫中的每個包名,因為它只列出類加載器已知的包名。 這意味着如果尚未從特定包加載類,則列表中將不存在該類。
使用zip文件處理例程打開jar文件,並按目錄名讀出包。 使用此技術,您將發現所有包名稱,甚至是那些尚未“使用”的包名稱。 基本上,任何包含.class
文件的路徑都是“包名”。
----編輯為進一步的細節表明沒有使用JAR文件---
既然你沒有使用JAR文件(為什么不呢?它們真的很棒!),你將不得不掃描目錄。 要“查找”目錄,您需要切斷類路徑。 獲取類路徑的方法是:
String classpath = System.getProperty("java.class.path", null);
然后搜索每個“起始點”下的所有目錄,其中包含.class
文件。 一旦掌握了所有這些,就擁有了所有的軟件包。
再說一次,只要問類加載器就不可能知道所有的包,除非你能以某種方式保證類加載器已經加載了所有的類(它通常不會加載)。
只要你不需要空包,這樣的東西應該有效:
/**
* 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;
}
它找到所有類,循環遍歷它們並獲取存儲在Set中的包名稱以避免重復。
不幸的是,我們不能只使用下面的代碼和普通的Reflection對象,而不指定允許對象掃描的自定義配置。
Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.