Spring提供许多工具类,AnnotationMetadata 就是其中之一。AnnotationMetadata 是用来访问指定类上的注解,处理注解非常方便。本章节就是来学习一些API。
前置条件
maven需要引入Spring、assertj-core包。
代码
public class AnnotationMetadataTest {
@Test
void standardAnnotationMetadata() {
AnnotationMetadata metadata = AnnotationMetadata.introspect(AnnotatedComponent.class);
doTestAnnotationInfo(metadata);
}
private void doTestAnnotationInfo(AnnotationMetadata metadata) {
assertThat(metadata.getClassName()).isEqualTo(AnnotatedComponent.class.getName());
assertThat(metadata.isInterface()).isFalse();
assertThat(metadata.isAbstract()).isFalse();
assertThat(metadata.isAnnotation()).isFalse();
assertThat(metadata.hasSuperClass()).isTrue();
assertThat(metadata.getSuperClassName()).isEqualTo(Object.class.getName());
assertThat(metadata.isAnnotated(DirectAnnotation.class.getName())).isTrue();
assertThat(metadata.isAnnotated(NestAnnotation.class.getName())).isTrue();
assertThat(metadata.isAnnotated(Scope.class.getName())).isTrue();
assertThat(metadata.hasAnnotation(DirectAnnotation.class.getName())).isTrue();
assertThat(metadata.hasAnnotation(NestAnnotation.class.getName())).isTrue();
assertThat(metadata.hasAnnotation(Scope.class.getName())).isFalse();
assertThat(metadata.getAnnotationTypes()).containsExactlyInAnyOrder(
DirectAnnotation.class.getName(),
NestAnnotation.class.getName()
);
AnnotationAttributes direAttrs = (AnnotationAttributes) metadata.getAnnotationAttributes(DirectAnnotation.class.getName());
assertThat(direAttrs).hasSize(2);
assertThat(direAttrs.getString("value")).isEqualTo("hello");
assertThat(direAttrs.getStringArray("additionArray")).containsExactlyInAnyOrder("HHH", "KKK");
Set<MethodMetadata> annotatedMethods = metadata.getAnnotatedMethods(Scope.class.getName());
assertThat(annotatedMethods).hasSize(1);
MethodMetadata next = annotatedMethods.iterator().next();
assertThat(next.isAbstract()).isFalse();
assertThat(next.isStatic()).isFalse();
assertThat(next.isAnnotated(Scope.class.getName())).isTrue();
}
// ------------------------------------
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DirectAnnotation {
String value() default "value";
String[] additionArray() default "direct";
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Scope {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Scope
public @interface NestAnnotation {
}
@DirectAnnotation(value = "hello", additionArray = {"HHH", "KKK"})
@NestAnnotation
private static class AnnotatedComponent implements Serializable {
@Scope
public void test() {}
}
}
这篇博客介绍了如何利用Spring的AnnotationMetadata类来访问和处理类上的注解。通过示例代码展示了如何检查注解的存在,获取注解属性以及遍历注解的方法。文章还包含了针对DirectAnnotation、NestAnnotation和Scope等自定义注解的测试。
1344

被折叠的 条评论
为什么被折叠?



