1.1 目标


掌握重复注解的使用
掌握类型注解的使用


1.2 重复注解的使用


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



重复注解的使用步骤:

1. 定义重复的注解容器注解
image.png
2. 定义一个可以重复的注解


image.png
3. 配置多个重复的注解
image.png
4. 解析得到指定注解
image.png
image.png

  1. package com.itheima.demo08annotation;
  2. import org.junit.Test;
  3. import java.lang.annotation.Repeatable;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. // 3.配置重复注解
  7. @MyTest("ta")
  8. @MyTest("tb")
  9. @MyTest("tc")
  10. public class Demo01 {
  11. @Test
  12. @MyTest("ma")
  13. @MyTest("mb")
  14. public void test() {
  15. }
  16. public static void main(String[] args) throws NoSuchMethodException {
  17. // 4.解析重复注解
  18. // 获取类上的重复注解
  19. // getAnnotationsByType是新增的API用户获取重复的注解
  20. MyTest[] annotationsByType = Demo01.class.getAnnotationsByType(MyTest.class);
  21. for (MyTest myTest : annotationsByType) {
  22. System.out.println(myTest);
  23. }
  24. System.out.println("----------");
  25. // 获取方法上的重复注解
  26. MyTest[] tests = Demo01.class.getMethod("test").getAnnotationsByType(MyTest.class);
  27. for (MyTest test : tests) {
  28. System.out.println(test);
  29. }
  30. }
  31. }
  32. // 1.定义重复的注解容器注解
  33. @Retention(RetentionPolicy.RUNTIME)
  34. @interface MyTests { // 这是重复注解的容器
  35. MyTest[] value();
  36. }
  37. // 2.定义一个可以重复的注解
  38. @Retention(RetentionPolicy.RUNTIME)
  39. @Repeatable(MyTests.class)
  40. @interface MyTest {
  41. String value();
  42. }

1.3 类型注解的使用


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

TYPE_PARAMETER :表示该注解能写在类型参数的声明语句中。 类型参数声明如: 、 TYPE_USE :表示注解可以再任何用到类型的地方使用。

TYPE_PARAMETER的使用

image.png
image.png

TYPE_USE的使用

image.png

package com.itheima.demo08annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.util.ArrayList;

public class Demo02 <@TypeParam T> {
    private @NotNull int a = 10;

    public void test(@NotNull String str, @NotNull int a) {
        @NotNull double d = 10.1;
    }

    public <@TypeParam E extends Integer> void test01() {
    }
}

@Target(ElementType.TYPE_USE)
@interface NotNull {
}

@Target(ElementType.TYPE_PARAMETER)
@interface TypeParam {
}

1.4 小结


通过@Repeatable元注解可以定义可重复注解, TYPE_PARAMETER 可以让注解放在泛型上, TYPE_USE 可以让注解放 在类型的前面