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

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

这是针对编译器的; 在解析foo.bar.Baz时,我想知道foo是否是一个包,以区别于其他任何东西。

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

  1. 看看你的类路径
  2. 如果您正在处理目录,则可以查找以.class结尾的所有文件
  3. 如果您正在处理jar,请加载jar并查找以.class结尾的所有文件
  4. 从文件末尾删除.class,将“\”替换为“。” 然后你有完全限定的类名。

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

ArrayList retval = new ArrayList>(); 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; 

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

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

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

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