簡體   English   中英

如何在類路徑中獲取包和/或類的列表?

[英]How do I get a list of packages and/or classes on the classpath?

在Java中,我可以使用ClassLoader來獲取已經加載的類的列表,以及這些類的包。 但是如何獲取可以加載的類列表,即在類路徑上? 與包相同。

這適用於編譯器; 在解析foo.bar.Baz時,我想知道foo是否是一個將其與其他任何東西區分開來的包。

我認為org.reflections庫應該做你想要的。 它會掃描類路徑,並允許您獲取所有類或僅擴展特定超類型的類。 從那里,應該可以獲得所有可用的包。

它有點棘手,有一些庫可以提供幫助,但基本上......

  1. 看看你的類路徑
  2. 如果您正在處理目錄,則可以查找以.class結尾的所有文件
  3. 如果您正在處理jar,請加載jar並查找以.class結尾的所有文件
  4. 從文件末尾刪除.class,將“\\”替換為“。” 然后你有完全限定的類名。

如果你的類路徑中有spring,那么你可以利用它們完成大部分工作:

ArrayList<String> retval = new ArrayList<Class<?>>();
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resolver);
String basePath = ClassUtils.convertClassNameToResourcePath("com.mypackage.to.search");
Resource[] resources;
try {
    resources = resolver.getResources("classpath*:" + basePath + "/**/*.class");
} catch (IOException e) {
    throw new AssertionError(e);
}
for (Resource resource : resources) {
    MetadataReader reader;
    try {
        reader = readerFactory.getMetadataReader(resource);
    } catch (IOException e) {
        throw new AssertionError(e);
    }
String className = reader.getClassMetadata().getClassName();
retval.add(className)   
}
return retval;

我自己已經找到了答案,但這是不可能的。

我知道的唯一方法是,您可以在特定目錄中加載所有類,然后在其中搜索以.class結尾的文件的名稱。

之后,您可以對這些文件名執行Class.forName(name_of_class_file).createInstance()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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