可重复注解
JDK8之前实现重复注解
public @interface MyAnnotation {
String value() default "";
}
@interface MyAnnotations{
MyAnnotation[] value();
}
@MyAnnotations({
@MyAnnotation(),@MyAnnotation})
class Test{
}
JDK8新增了@Repeatable()元注解
import java.lang.annotation.Repeatable;
@Repeatable(MyAnnotations.class)
public @interface MyAnnotation {
String value() default "";
}
@interface MyAnnotations{
MyAnnotation[] value();
}
@MyAnnotation()
@MyAnnotation()
class Test{
}
类型注解
JDK8之后,关于元注解@Target的参数类型ElementType枚举值多了两个: TYPE_PARAMETER,TYPE_USE
在JDK8之前,注解只能是在声明的地方所使用,JDK8开始,注解可以应用在任何地方
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中
API
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
代码验证
TYPE_PARAMETER
@Target(ElementType.TYPE_PARAMETER)
public @interface MyAnnotation {
String value() default "";
}
class Test<@MyAnnotation() T>{
}
TYPE_USE
@Target(ElementType.TYPE_USE)
public @interface MyAnnotation {
String value() default "";
}
class Test{
public void test() throws @MyAnnotation() Exception{
List<@MyAnnotation() String> list = new ArrayList<>();
int i=(@MyAnnotation() int) 10d;
}
}