2009-08-20 121 views
2

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

這是一個編譯器;當解析foo.bar.Baz時,我想知道foo是否是一個包來區分它。

回答

3

它有點棘手,有幾個庫,可以幫助,但基本上...

  1. 看看你的classpath
  2. 如果你正在處理一個目錄,你可以看看所有文件結束於.class
  3. 如果您正在處理jar,請加載jar並查找以.class結尾的所有文件。
  4. 從文件末尾除去.class,將「\」替換爲「。 「然後你有完全合格的類名。

如果您在類路徑中有春天,你可以把他們的優勢,做最本已:

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; 
2

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

我知道的唯一方法是你有所有可以加載到特定目錄的類,然後搜索它以.class結尾的文件的名稱。

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

3

我認爲org.reflections library應該做你想做的。它掃描類路徑,並允許您獲取所有類或僅擴展特定超類型的類。從那裏,應該有可能獲得所有可用的軟件包。