2009-08-20 122 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应该做你想做的。它扫描类路径,并允许您获取所有类或仅扩展特定超类型的类。从那里,应该有可能获得所有可用的软件包。