package cn.org.rapid_framework.util; import java.util.ArrayList; import java.util.List; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.Assert; /** * 搜索class的工具类 * @author badqiu * */ public class ScanClassUtils { /** * 根据多个包名搜索class * 例如: ScanClassUtils.scanPakcages("javacommon.**.*"); * @param basePackages 各个包名使用逗号分隔,各个包名可以有通配符 * @return List包含className */ @SuppressWarnings("all") public static List<String> scanPackages(String basePackages) throws IllegalArgumentException{ Assert.notNull(basePackages,"'basePakcages' must be not null"); ResourcePatternResolver rl = new PathMatchingResourcePatternResolver(); MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(rl); List result = new ArrayList(); String[] arrayPackages = basePackages.split(","); try { for(int j = 0; j < arrayPackages.length; j++) { String packageToScan = arrayPackages[j]; String packagePart = packageToScan.replace('.', '/'); String classPattern = "classpath*:/" + packagePart + "/**/*.class"; Resource[] resources = rl.getResources(classPattern); for (int i = 0; i < resources.length; i++) { Resource resource = resources[i]; MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); String className = metadataReader.getClassMetadata().getClassName(); result.add(className); } } }catch(Exception e) { new IllegalArgumentException("scan pakcage class error,pakcages:"+basePackages); } return result; } }