spring中的工具类

76 阅读1分钟

获取注解工具类

查询Config类上是否有ComponentScan注解
ComponentScan componentScan = AnnotationUtils.findAnnotation(Config.class, ComponentScan.class);

加载classpath下的类

String path = "classpath*:" + p.replace(".", "/") + "/**/*.class";
CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory();
Resource[] resources = new PathMatchingResourcePatternResolver().getResources(path);

判断是否有某个注解

// 判断方法上是否有Transactional注解
MergedAnnotations annotations = MergedAnnotations.from(method);
if (annotations.isPresent(Transactional.class)) {
    return true;
}

// 判断类上是否有Transactional注解
MergedAnnotations annotations =  MergedAnnotations.from(targetClass,MergedAnnotations.SearchStrategy.TYPE_HIERARCHY);
if (annotations.isPresent(Transactional.class)) {
    return true;
}

获取类上的泛型

class A<T>{}
class B extends A<Teacher>{}

// jdk获取
Type genericSuperclassType = B.class.getGenericSuperclass()
// 具有泛型,判断才会成功
if(genericSuperclassType instanceof ParameterizedType){
    // 得到第一个泛型
    ((ParameterizedType) genericSuperclassType).getActualTypeArguments()[0];
}

// springboot 获取
Class clazz = GenericTypeResolver.resolveTypeArgument(B.class, A.class);
System.out.println(clazz);

查找注解

// 获取到Config类上的ComponentScan注解
ComponentScan scan = AnnotationUtils.findAnnocation(Config.class, ComponentScan.class);

// returnType对象所属的类
MethodParameter returnType;
returnType.getContainingClass();

读取MATA-INFO文件夹下spring.factories

// 获取到spring.factories文件下的实现MyImportSelector的所有类名
List<String> names = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class, classLoader);