1. 重复注解
重复注解的使用步骤:
1、定义重复的注解容器注解
2、定义一个可以重复的注解
3、配置多个重复的注解
4、解析得到指定的注解
// 3、配置重复注解
@MyTest("a")
@MyTest("b")
@MyTest("c")
public class Demo01 {
public static void main(String[] args) throws NoSuchMethodException {
// 4、解析得到指定的注解 类上
// getAnnotationsByType获取解析重复注解
MyTest[] annotationsByType = Demo01.class.getAnnotationsByType(MyTest.class);
for (MyTest myTest : annotationsByType) {
System.out.println(myTest);
}
// 4、解析得到指定的注解 方法上
MyTest[] tests = Demo01.class.getMethod("test").getAnnotationsByType(MyTest.class);
for (MyTest test : tests) {
System.out.println(test);
}
}
@MyTest("fa")
@MyTest("fb")
public void test() {
}
}
// 1、定义重复的注解容器注解
@Retention(RetentionPolicy.RUNTIME)
@interface MyTests { // 重复注解容器
MyTest[] value();
}
// 2、定义一个可以重复的注解
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyTests.class)
@interface MyTest {
String value();
}
2. 类型注解
JDK8为@Target元注解新增了两种类型:TYPE_PARAMETER
, TYPE_USE
-
TYPE_PARAMETER
:表示该注解能写在类型参数的声明语句中,类型参数声明如:<T>
,<T extends Person>
-
TYPE_USE
:表示注解可以在任何用到类型的地方使用。
public class Demo02<@TypeParam T> {
private @NotNull int a = 10;
public void test(@NotNull String str,@NotNull int num) {
}
public <@TypeParam E extends Integer> void test1() {
}
}
@Target(ElementType.TYPE_PARAMETER)
@interface TypeParam {
}
@Target(ElementType.TYPE_USE)
@interface NotNull {
}
3、小结
通过@Repeatable
元注解可以定义可重复注解,TYPE_PARAMETER
可以让注解放在泛型上, TYPE_USE
可以让注解放在类型的前面。