JDK8 重复注解和类型注解(九)

1,188 阅读1分钟

重复注解和类型注解

自从JDK1.5中引入注解以来,注解开始变得非常流行,并在各个框架和项目中被广泛使用. 不过注解有一个很大的限制是,在同一个注解中不能多次使用同一个注解. JDK8引入了重复注解的概念,允许在同一个地方多次使用同一个注解. 在JDK8中使用@Repeatable注解定义重复注解.

重复注解

重复注解的使用步骤:

  1. 定义重复注解容器注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTests {
    RepeatableMyTests[] value();
}
  1. 定义一个可重复的注解
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyTests.class)
public @interface RepeatableMyTests {
    String value();
}
  1. 配置重复注解
@RepeatableMyTests("11")
@RepeatableMyTests("12")
public class Demo01 {
   
    @RepeatableMyTests("1")
    @RepeatableMyTests("2")
    public void test01() {

    }
}
  1. 解析重复注解
public static void main(String[] args) throws NoSuchMethodException {
        //解析重复注解
        //getAnnotationsByType新增的api 用于获取重复的注解
        //获取类上的重复注解
        RepeatableMyTests[] annotationsByType = Demo01.class.getAnnotationsByType(RepeatableMyTests.class);
        for (RepeatableMyTests repeatableMyTest : annotationsByType) {
            System.out.println(repeatableMyTest);
        }
        //获取方法上的重复注解
        RepeatableMyTests[] annotationsByType2 = Demo01.class.getMethod("test01").getAnnotationsByType(RepeatableMyTests.class);
        for (RepeatableMyTests repeatableMyTest : annotationsByType2) {
            System.out.println(repeatableMyTest);
        }
    }

类型注解

JDK8 为@Target元注解新增了两种类型: TYPE_PARAMETER, TYPE_USE

TYPE_PARAMETER: 表示该注解写在类型参数的声明语句中, 类型参数声明如:

//定义
@Target(ElementType.TYPE_PARAMETER)
public @interface TypeParam {
}

//使用
public <@TypeParam E extends Integer> void testo1() {

}

TYPE_USE: 表示注解可以再任何用到类的地方使用

定义
@Target(ElementType.TYPE_USE)
public @interface Notnull {
}
//使用
private @Notnull int index =0;
    public void test02(@Notnull String str, @Notnull int a){
         @Notnull int index =0;

    }