我如何在类路径上的包和/或类列表?(How do I get a list of packages

2019-08-01 23:55发布

在Java中,我可以用一个ClassLoader获得的已装入类,这些类的软件包的列表。 但我怎么得到的,可以被加载的类,即在类路径列表? 同样的,包。

这是一个编译器; 解析foo.bar.Baz的时候,我想知道FOO是否为包从别的区分开来。

Answer 1:

它有点棘手,并有几个库,可以帮助,但基本上...

  1. 看看你的类路径
  2. 如果你正在处理一个目录,你可以看看所有文件中的.class结束
  3. 如果你正在处理一个罐子,装入罐子去寻找所有文件中的.class结束
  4. 从文件的结尾处删除的.class,代替“\”和“” 然后你有完全合格的类名。

如果你在classpath有春天,你可以利用他们做这个最不已:

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;


Answer 2:

我认为org.reflections库应该做你想要什么。 它会扫描类路径,并允许您,例如,让所有的类或只是那些超过一个特定的超类型。 从那里,它应该可以得到所有可用的软件包。



Answer 3:

我已经寻找这个问题的答案我自己,但它是不可能的。

我所知道的唯一的办法是,你有可能会在特定目录中加载的所有类,然后搜索它用的.class结尾的文件的名称。

在此之后,你可以做Class.forName(name_of_class_file).createInstance()对这些文件的名称。



文章来源: How do I get a list of packages and/or classes on the classpath?