注解Annotation

  • 1.Annotation架构
  • 2.Annotation组成
  • Annotation.java
  • ElementType.java
  • RetentionPolicy.java
  • 3.注解用途


写在前面:本篇博客只用于学习笔记


Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

1.Annotation架构

java方法注解与参数传递_Java


从中,我们可以看出:

(01) 1 个 Annotation 和 1 个 RetentionPolicy 关联。
可以理解为:每1个Annotation对象,都会有唯一的RetentionPolicy属性。

(02) 1 个 Annotation 和 1~n 个 ElementType 关联

可以理解为:对于每 1 个 Annotation 对象,可以有若干个 ElementType 属性。

(03) Annotation 有许多实现类,包括:Deprecated, Documented, Inherited, Override 等等。

Annotation 的每一个实现类,都 “和 1 个 RetentionPolicy 关联” 并且 " 和 1~n 个 ElementType 关联"。

2.Annotation组成

java Annotation 的组成中,有 3 个非常重要的主干类。它们分别是:

Annotation.java

package java.lang.annotation;
public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

Annotation 就是个接口。

ElementType.java

package java.lang.annotation;
public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型。
“每 1 个 Annotation” 都与 “1~n 个 ElementType” 关联。当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。

RetentionPolicy.java

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

3.注解用途

  • 注解的作用
  • 不是程序本身 , 可以对程序作出解释.(这一点和注释(comment)没什么区别)
  • 可以被其他程序(比如:编译器等)读取.
  • Annotation格式
  • 注解是以"@注释名"在代码中存在的
  • 还可以添加一些参数值 , 例如:@SuppressWarnings(value="unchecked")
  • Annotation在哪里使用?
  • 可以附加在package , class , method , field 等上面 , 相当于给他们添加了额外的辅助信息
  • 我们可以通过反射机制实现对这些元数据的访问

写在后面:
参考资料:
【狂神说Java】注解和反射Java注解