https://www.jianshu.com/p/22c939f97f1e
无论是什么框架,包括Spring, 完成这个功能底层都是用的ClassLoader.getResources()
或ClassLoader.getSystemResources()
方法实现的,即先找出指定classpath下的"资源",可能是文件也可能是jar包,然后通过文件I/O读取jar, 把每一个.class
文件名全部列出即可
作者:司青玄
链接:https://www.jianshu.com/p/22c939f97f1e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Spring就有现成的类可以让我们直接使用, 它们分别是ResourcePatternResolver
和CachingMetadataReaderFactory
,使用方法如下:
public class ScanTest extends BaseTestClass implements ResourceLoaderAware {
/**
* Spring容器注入
*/
private ResourceLoader resourceLoader;
@Test
public void test() throws IOException {
ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
MetadataReaderFactory metaReader = new CachingMetadataReaderFactory(resourceLoader);
Resource[] resources = resolver.getResources("classpath*:your/package/name/**/*.class");
for (Resource r : resources) {
MetadataReader reader = metaReader.getMetadataReader(r);
System.out.println(reader.getClassMetadata().getClassName());
}
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
}