自定义注解
@Retention(RetentionPolicy.RUNTIME) // 元注解:注解的注解。此注解表示使注解保留到运行时。
@Target(ElementType.METHOD) // Target中可以存放数组。ElementType.METHOD:表示只能标记在方法上
public @interface TestAnno {
// 是一个特殊的属性,属性名就是方法名,类型就是返回类型,这里设置默认为空字符串
String value() default "";
}
通过java的反射获取注解
public class AnnotationDemo {
@TestAnno("ad")
public void test() {
Class<AnnotationDemo> clazz = AnnotationDemo.class;
Method[] methods = clazz.getMethods();
// 找到TestAnno注解的方法
Optional<Method> optional = Arrays.stream(methods)
.filter(method -> method.isAnnotationPresent(TestAnno.class)).findAny();
// 获取注解的值
optional.ifPresent(method -> System.out.println(method.getAnnotation(TestAnno.class).value()));
// 判断某类是否有某个注解
System.out.println(AnnotationDemo.class.isAnnotationPresent(TestAnno.class));
// 获取类上的相应注解
TestAnno anno = AnnotationDemo.class.getAnnotation(TestAnno.class);
System.out.println(anno);
}
public static void main(String[] args) {
new AnnotationDemo().test();
}
public @interface Filters {
Filter[] value();
}
@Repeatable(Filters.class) // 重复注解
public @interface Filter {
String value();
}
@Filter("1")
@Filter("2")
public void test2() {}
}