在 Java 中,我可以使用 ClassLoader 来获取已加载的类的列表以及这些类的包。但是如何获取可以加载的类的列表,即位于类路径上的类的列表?与包裹相同。
这是针对编译器的;在解析 foo.bar.Baz 时,我想知道 foo 是否是一个包,以将其与其他任何东西区分开来。
这有点棘手,有一些库可以提供帮助,但基本上......
- 查看你的类路径
- 如果您正在处理目录,则可以查找以 .class 结尾的所有文件
- 如果您正在处理一个 jar,请加载该 jar 并查找所有以 .class 结尾的文件
- 从文件末尾删除 .class,将“\”替换为“.”然后你就有了完全限定的类名。
如果你的类路径中有 spring,你可以利用它们已经完成了大部分工作:
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)