簡體   English   中英

使用java反射獲取包名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM