概述

java程序中的标注

自定义注解

语法规范

public @interface 注解名称 { public 属性类型 属性名() default 默认值; }

代码实战

  1. // 自定义一个注解类Book
  2. public @interface Book {
  3. String name();
  4. String author();
  5. double price();
  6. }

元注解

修饰注解的注解

@Target

概念

标识修饰的这个注解能够在哪些程序单元上使用

jkd1.8源码
image.png
value成员变量是一个ElementType的数组,可以取下面几个参数

  • ElementType.Type
  • ElementType.FIELD
  • ElementType.METHOD
  • ElementType.PARAMETER
  • ElementType.CONSTRUCTOR
  • ElementType.LOCAL_VARIABLE
  • ElementType.ANNOTATION_TYPE
  • ElementType.PACKAGE
  • ElementType.TYPE_PARAMETER
  • ElementType.TYPE_USE

    @Retention

    注解生效的范围,在哪些阶段生效

jdk1.8源码
image.png
该注解类Retention的成员变量value可以的几种取值

  • RetentionPolicy.SOURCE (在编译阶段生效,注解只作用在源码阶段,生成的字节码文件中不存在)
  • RetentionPolicy.CLASS(在源码阶段和字节码文件阶段有效,运行时不存在, 是默认值)
  • RetentionPolicy.RUNTIME(注解在源码阶段、字节码文件阶段和运行阶段均有效)

    @Documented

    @Inherited

    注解解析

    判断是否存在注解、存在就解析出内容

与注解解析相关的接口

Annotation:注解的顶级接口,注解都是Annotation类型的对象 AnnotatElement:该接口定义了与注解解析相关的解析方法 image.png 所有类成分(Class、Method、Field、Constructor)都实现了AnnotatElement接口,因此具有解析注解的能力

注解解析实战案例
image.png

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.TYPE, ElementType.METHOD})
  3. public @interface Book {
  4. String name();
  5. double price() default 100;
  6. String[] authors();
  7. }
  8. @Book(authors = { "罗贯中","吴承恩","施耐庵","曹雪芹" },
  9. name = "《四大名著合辑》")
  10. public class BookStore {
  11. @Book(authors = { "jack", "lucy" },
  12. name = "《泰坦尼克号》", price = 77.7)
  13. public void m1() {
  14. System.out.println("you jump!!! I jump!!! ");
  15. }
  16. }
  17. @SuppressWarnings("all")
  18. public class AnnotationResolveDemo {
  19. public static void main(String[] args) throws Exception {
  20. BookStore bookStore = new BookStore();
  21. Class<? extends BookStore> cls = bookStore.getClass();
  22. // 获取TYPE上的注解信息
  23. Annotation[] annotations = cls.getDeclaredAnnotations();
  24. for(Annotation a: annotations) {
  25. System.out.println(a);
  26. }
  27. // 获取METHOD上的注解信息
  28. Method m1 = cls.getMethod("m1");
  29. Annotation[] annotations2 = m1.getAnnotations();
  30. for(Annotation a: annotations2) {
  31. System.out.println(a);
  32. }
  33. }
  34. }