如何在类路径中获取包和/或类的列表?

时间:2009-08-20 21:32:02

标签: java reflection classloader

在Java中,我可以使用ClassLoader来获取已经加载的类的列表,以及这些类的包。但是如何获得可以加载的类列表,即在类路径上?与包相同。

这适用于编译器;在解析foo.bar.Baz时,我想知道foo是否是一个可以将它与其他任何东西区分开来的包。

3 个答案:

答案 0 :(得分:3)

我认为org.reflections library应该做你想要的。它会扫描类路径,并允许您获取所有类或仅扩展特定超类型的类。从那里,应该可以获得所有可用的包。

答案 1 :(得分:3)

它有点棘手,有一些库可以提供帮助,但基本上......

  1. 查看你的课程路径
  2. 如果您正在处理目录,则可以查找以.class
  3. 结尾的所有文件
  4. 如果您正在处理jar,请加载jar并查找以.class
  5. 结尾的所有文件
  6. 从文件末尾删除.class,将“\”替换为“。”然后你就拥有了完全合格的类名。
  7. 如果你的类路径中有弹簧,你可以利用它们完成大部分工作:

    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 :(得分:2)

我自己搜索过这个答案,但这是不可能的。

我知道的唯一方法是你拥有可以在特定目录中加载的所有类,然后在其中搜索以.class结尾的文件名。

之后,您可以对这些文件名执行Class.forName(name_of_class_file).createInstance()