一、重复注解与类型注解介绍
Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。
重复注解:使用@Repeatable元注解,参数为可重复注解的容器,重复注解可以在目标上重复使用
类型注解:java8中为ElementType新增了两个枚举值:TYPE_PARAMETER和TYPE_USE
二、重复注解与类型注解使用
1、重复注解
即可以在同一方法、属性、类等类型中多次使用同一个注解。此特性相当于对JAVA8之前的重复注解在编译层面的增强,JAVA8实现此特性主要依赖于@Repeatable注解。
JAVA8之前的写法
定义一个重复注解:
1 @interface MyRepAnno{ 2 String value(); 3 } 4 @interface MyRepAnnos{ 5 MyRepAnno[] value(); 6 }
使用此注解:
1 @MyRepAnnos({@MyRepAnno(""),@MyRepAnno("")}) 2 class TestMyClass{}
JAVA8中的写法
定义一个重复注解
1 @Repeatable(MyRepAnnos.class) 2 @interface MyRepAnno{ 3 String value(); 4 } 5 @interface MyRepAnnos{ 6 MyRepAnno[] value(); 7 }
使用此注解:
1 @MyRepAnno("") 2 @MyRepAnno("") 3 class TestMyClass{}
上面例子中发现JAVA8中定义重复注解与JAVA7相比只是多了个@Repeatable,使用重复注解的地方JAVA8则比之前的写法更简单方便,可读性更强。
2、类型注解
TYPE_PARAMETER
表示该注解能使用在自定义类型参数(参数的自定义类型可以是javaBean或者枚举等)的声明语句中。例子如下:
先声明个使用TYPE_PARAMETER参数的自定义注解@MyAnno
1 @Target({ElementType.TYPE_PARAMETER}) 2 @interface MyAnno{}
定义一个方法使用自定义类型MyClass
1 public String getMyClassInfo(MyClass cls){ 2 return null; 3 }
下面语句则是在自定义类型MyClass的声明使用了@MyAnno注解
1 class MyClass<@myAnno String>{}
TYPE_USE
表示该注解能使用在使用类型的任意语句中。
先定义一个自定义注解:
1 @Target({ElementType.TYPE_USE}) 2 @interface MyAnnoUse{}
下面演示四种情形:
- 创建实例时使用
1 MyClass<String> aClass = new @MyAnnoUse MyClass<>();
- 类型强转时使用
1 Object o = "test"; 2 String str = (@MyAnnoUse String) o;
- 方法形参中使用
1 public String getUser(@MyAnnoUse String name, Integer age){ 2 return null; 3 }
- 泛型中使用
1 public String getClasses(List<@MyAnnoUse User> list){ 2 return null; 3 }