注解 | Annotation

Annotation就是代码里的特殊标记,这些标记可以在编译期、类加载期和运行时 被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变代码原有逻辑的前提下,在源文件中嵌入一些补充信息。
Annotation可以像修饰符一样被使用,可用于修饰 包、类、构造器、方法、成员变量、方法参数、局部变量 的声明,这些信息被保存在Annotation的"name = value"键值对中。

元注解

元注解的作用就是负责定义其他注解,Java定义了4个标准的meta-annotation 元注解类型,它们用于提供对其他annotation类型进行说明,这些元注解都在java.lang.annotation包中。

@Target:用于修饰一个Annotation的作用目标,用于描述注解的使用范围。

  • @Target(ElementType.TYPE) – 接口、类、枚举、注解

  • @Target(ElementType.FIELD) – 字段、枚举的常量

  • @Target(ElementType.METHOD) – 方法

  • @Target(ElementType.PARAMETER) – 方法参数

  • @Target(ElementType.CONSTRUCTOR) – 构造函数

  • @Target(ElementType.LOCAL_VARIABLE) – 局部变量

  • @Target(ElementType.ANNOTATION_TYPE) – 注解

  • @Target(ElementType.PACKAGE) – 包

@Retention : 用于修饰一个Annotation的声明周期,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值。

  • RetentionPolicy.SOURCE : 在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注解;

  • RetentionPolicy.CLASS【默认值】 : 在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解;

  • RetentionPolicy.RUNTIME : 在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注解,程序可以通过反射获取注解的内容;

  • Source(源代码) < Class(类) < Runtime(运行时)

  • @Retention:注解的保留位置

    • @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含;
    • @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得;
    • @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到;
  • @Document : 说明该注解将被包含在javadoc中

  • @Inherited : 子类可以继承父类的注解

todo…