这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
AnnotationUtils
位于spring-core
包下面,提供一些方法用于简单的获取到注解相关信息
1.findAnnotation
获取Class/Method
上面标注的注解
// 获取Class上面标注的注解
public static <A extends Annotation> A findAnnotation(Class<?> clazz, @Nullable Class<A> annotationType)
// 获取Method上面的注解信息
public static <A extends Annotation> A findAnnotation(Method method, @Nullable Class<A> annotationType)
案例
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* Description:
*
* @author jack
* @date 2021/8/26 8:38 下午
*/
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {
@Bean(name = "car")
public void car() {
}
public static void main(String[] args) {
// 获取Class上面的注解
RequestMapping requestMapping = AnnotationUtils.findAnnotation(MainController.class, RequestMapping.class);
System.out.println(requestMapping);
System.out.println(Arrays.toString(requestMapping.value()));
// 获取Method上面的注解
Method carMethod = ReflectionUtils.findMethod(MainController.class, "car");
Bean bean = AnnotationUtils.findAnnotation(carMethod, Bean.class);
System.out.println(Arrays.toString(bean.name()));
}
}
输出结果
2.getAnnotationAttributes
获取annotation
的所有属性
public static Map<String, Object> getAnnotationAttributes(Annotation annotation)
案例
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* Description:
*
* @author jack
* @date 2021/8/26 8:38 下午
*/
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {
public static void main(String[] args) {
// 获取Class上面的注解
RequestMapping requestMapping = AnnotationUtils.findAnnotation(MainController.class, RequestMapping.class);
// 获取 RequestMapping注解的所有属性
Map<String, Object> annotationAttributes = AnnotationUtils.getAnnotationAttributes(requestMapping);
System.out.println(annotationAttributes);
}
}
输出结果
3.isAnnotationDeclaredLocally
验证annotation
是否直接注释在类上而不是集成来的。
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Description:
*
* @author jack
* @date 2021/8/26 8:38 下午
*/
@RequiredArgsConstructor
@RestController
@RequestMapping(value = "/api/main")
@Slf4j
public class MainController {
public static void main(String[] args) {
boolean isExistsRequestMapping = AnnotationUtils.isAnnotationDeclaredLocally(RequestMapping.class, MainController.class);
System.out.println(isExistsRequestMapping);
boolean isExistsMapping = AnnotationUtils.isAnnotationDeclaredLocally(Mapping.class, MainController.class);
System.out.println(isExistsMapping);
}
}
输出结果
在MainController
上标注了@RequestMapping
,而@RequestMapping
注解上面标注了@Mapping
注解 所以在调用一下代码时 输出为false
AnnotationUtils.isAnnotationDeclaredLocally(Mapping.class, MainController.class)