SpringBoot扫描包获取类信息-基于实现类\接口
需求:获取包下面实现了某个类的所有类
基于实现类
/**
* * 获取包下面所有实现了clz类的全限定名
*
* @param packgeName 包名
* @param clz 父类名
* @return
*/
public static List<String> getClassFQName(String packgeName, Class clz) {
final String BASE_PACKAGE = packgeName;
final String RESOURCE_PATTERN = "/**/*.class";
ArrayList<String> list = new ArrayList<>();
if (packgeName == null || clz == null) {
return list;
}
//spring工具类,可以获取指定路径下的全部类
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
try {
String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
Resource[] resources = resourcePatternResolver.getResources(pattern);
//MetadataReader 的工厂类
MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
for (Resource resource : resources) {
//用于读取类信息
MetadataReader reader = readerfactory.getMetadataReader((org.springframework.core.io.Resource) resource);
//扫描到的class
String classname = reader.getClassMetadata().getClassName();
Class<?> clazz = Class.forName(classname);
//判断是否有指定主解
// MyAnno anno = clazz.getAnnotation(MyAnno.class);
// if (anno != null) {
// //将注解中的类型值作为key,对应的类作为 value
// handlerMap.put(classname, clazz);
// }
// 判断是否实现指定类型
//isAssignableFrom()方法是判断是否是某个类的父类
if (clz.isAssignableFrom(clazz)) {
list.add(clazz.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
测试
@Test
public void test006() throws InstantiationException, IllegalAccessException {
final String BASE_PACKAGE = "com.sifan.erp.common";
List<String> classFQName = CommonUtil.getClassFQName(BASE_PACKAGE, Job.class);
classFQName.forEach(System.out::println);
}
结果:成功获取所有实现了Job接口的类