利用spring的掃描工具類,掃描自定義的註解
阿新 • • 發佈:2019-04-16
public class ReadAnnotationUtils {
private static final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
private static final SimpleMetadataReaderFactory register = new SimpleMetadataReaderFactory();
private static final StandardEnvironment environment = new StandardEnvironment();
/**
* 根據包路徑,獲取Class的資源路徑
*
* @param packagePath
* @return
*/
public static String getResourcePath(String packagePath) {
if (StringUtils.isEmpty(packagePath)) return "";
String resourcePath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(environment.resolveRequiredPlaceholders(packagePath))
+ '/' + "**/*.class";
return resourcePath;
}
/**
* 獲取指定路徑下的類
*
* @param pkgPath
* @param annoClazz
* @return
*/
public static Set<Class> getClazzFromAnnotation(String pkgPath, Class<? extends Annotation> annoClazz) {
//獲取spring的包路徑
String pathPackage = getResourcePath(pkgPath);
Set<Class> paths = new HashSet<>();
Resource[] resources = new Resource[0];
try {
//載入路徑
resources = resolver.getResources(pathPackage);
} catch (IOException e) {
//異常處理
return new HashSet<>();
}
for (int i = 0; i < resources.length; i++) {
Resource resource = resources[i];
MetadataReader metadataReader = null;
try {
//讀取資源
metadataReader = register.getMetadataReader(resource);
} catch (IOException e) {
continue;
}
//讀取資源的註解配置
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//判斷是否包含註解
if (!annotationMetadata.hasAnnotation(annoClazz.getName())) continue;
//類資訊
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//類全名
String className = classMetadata.getClassName();
try {
//載入類
Class<?> clazz = Class.forName(className);
paths.add(clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return paths;
}
public static void main(String[] args) {
//測試
Set<Class> clazz = getClazzFromAnnotation("com.pkg.fp", RSPI.class);
System.out.println(clazz);
}
}