开发过程中,有时需要获取某个包下的所有类,或者基于指定规则获取类清单。
比较常见的解决方案是自己遍历目录,查找所有.class文件。
下面这个方法使用spring工具类实现,简化过程,不再需要自己遍历目录
/**
* 获取在指定包下某个class的所有非抽象子类
*
* @param parentClass
* 父类
* @param packagePath
* 指定包,格式如"com/iteye/strongzhu"
* @return 该父类对应的所有子类列表
*/
@SneakyThrows(ClassNotFoundException.class)
public static <E> List<Class<E>> getSubClasses(final Class<E> parentClass,
final String packagePath) {
final ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(
false);
provider.addIncludeFilter(new AssignableTypeFilter(parentClass));
final Set<BeanDefinition> components = provider
.findCandidateComponents(packagePath);
final List<Class<E>> subClasses = new ArrayList<Class<E>>();
for (final BeanDefinition component : components) {
@SuppressWarnings("unchecked")
final Class<E> cls = (Class<E>) Class.forName(component
.getBeanClassName());
if (Modifier.isAbstract(cls.getModifiers())) {
continue;
}
subClasses.add(cls);
}
return subClasses;
}