十 重复注解与类型注解

Java8对注解处理提供了两点改进:可重复的注解及可用于类型的注解

1.可重复注解

Java8以前定义注解:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "mobei";
}

使用:


image.png

可以看到这时当做重复注解使用就报错了。
如果要使用重复注解,必须先定义一个容器:

//注解容器
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
    MyAnnotation[] value();
}

在重复注解上标注@Repeatable注解并指定容器类:

//使用可重复注解:①必须使用@Repeatable注解标注该注解②在@Repeatable注解中指定该注解的注解容器
@Repeatable(MyAnnotations.class)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, TYPE_PARAMETER})//TYPE_PARAMETER:J8中新增加的类型注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "mobei";
}

使用:


image.png

不报错,测试:

    @Test
    public void test1() throws Exception {
        Class clazz = TestAnnotation.class;
        Method m1 = clazz.getMethod("show");
        MyAnnotation[] mas = m1.getDeclaredAnnotationsByType(MyAnnotation.class);
        for (MyAnnotation myAnnotation : mas) {
            System.out.println(myAnnotation.value());
        }
    }

输出:

Hello
World
2.类型注解

在上面的MyAnnotation的@Target注解中加入TYPE_PARAMETER

//使用可重复注解:①必须使用@Repeatable注解标注该注解②在@Repeatable注解中指定该注解的注解容器
@Repeatable(MyAnnotations.class)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, TYPE_PARAMETER})//TYPE_PARAMETER:J8中新增加的类型注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "mobei";
}

可以修饰参数:

@MyAnnotation("Hello")
@MyAnnotation("World")
public void show(@MyAnnotation("abc") String str){
}

你可能感兴趣的:(十 重复注解与类型注解)