在Java中,我可以用一个ClassLoader获得的已装入类,这些类的软件包的列表。 但我怎么得到的,可以被加载的类,即在类路径列表? 同样的,包。
这是一个编译器; 解析foo.bar.Baz的时候,我想知道FOO是否为包从别的区分开来。
在Java中,我可以用一个ClassLoader获得的已装入类,这些类的软件包的列表。 但我怎么得到的,可以被加载的类,即在类路径列表? 同样的,包。
这是一个编译器; 解析foo.bar.Baz的时候,我想知道FOO是否为包从别的区分开来。
它有点棘手,并有几个库,可以帮助,但基本上...
如果你在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;
我认为org.reflections库应该做你想要什么。 它会扫描类路径,并允许您,例如,让所有的类或只是那些超过一个特定的超类型。 从那里,它应该可以得到所有可用的软件包。
我已经寻找这个问题的答案我自己,但它是不可能的。
我所知道的唯一的办法是,你有可能会在特定目录中加载的所有类,然后搜索它用的.class结尾的文件的名称。
在此之后,你可以做Class.forName(name_of_class_file).createInstance()
对这些文件的名称。