package alien4cloud.utils;
import java.util.HashSet;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;
@Slf4j
public final class TypeScanner {
private TypeScanner() {
}
public static Set<Class<?>> scanTypes(String basePackage, Class<?> targetType) throws ClassNotFoundException {
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
AssignableTypeFilter filter = new AssignableTypeFilter(targetType);
scanner.addIncludeFilter(filter);
Set<BeanDefinition> beanSet = scanner.findCandidateComponents(basePackage);
Set<Class<?>> classSet = new HashSet<Class<?>>();
for (BeanDefinition beanDef : beanSet) {
log.debug("found candidate bean = {}", beanDef.getBeanClassName());
Class<?> clazz;
clazz = Class.forName(beanDef.getBeanClassName(), true, Thread.currentThread().getContextClassLoader());
classSet.add(clazz);
}
return classSet;
}
}