注解是放在Java源码的类、方法、字段、参数前的一种特殊”注释”。
注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。

三类注解

  1. 由编译器使用的注解
    • SOURCE 类型
    • @Override:让编译器检查该方法是否正确地实现了覆写
    • @SuppressWarnings:告诉编译器忽略此处代码产生的警告
    • 这类注解不会被编译进入.class文件
  2. 由工具处理.class文件使用的注解
    • CLASS 类型
    • 这类注解会被编译进入.class文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。
  3. 程序运行期能够读取的注解
    • RUNTIME 类型
    • 加载后一直存在于JVM中
    • 最常用注解

      定义注解

      用 @interface 来定义注解
      1. public @interface Report {
      2. int type() default 0;
      3. String level() default "info";
      4. String value() default "";
      5. }

元注解

元注解: 用来修饰其他注解的注解

  • @Target(ElementType)
    • 定义 该注解 能够被应用于源码的哪些位置:
      • 类或接口:ElementType.TYPE
      • 字段:ElementType.FIELD
      • 方法:ElementType.METHOD
      • 构造方法:ElementType.CONSTRUCTOR
      • 方法参数:ElementType.PARAMETER
  • @Retention(RetentionPolicy)
    • 定义了 该注解 的生命周期
      • 仅编译期:RetentionPolicy.SOURCE
      • 仅class文件:RetentionPolicy.CLASS
      • 运行期:RetentionPolicy.RUNTIME
  • @Repeatable(Class 该注解的类)
    • 定义 该注解 是否可重复
  • @Inherited()

    • 定义子类是否可继承父类定义的 注解
    • 仅针对 @Target(ElementType.TYPE) 的注解
    • 接口 继承无效

      利用反射对注解进行处理

  • 判断注解是否存在

    • Class.isAnnotationPresent(Class)
    • Field.isAnnotationPresent(Class)
    • Method.isAnnotationPresent(Class)
    • Constructor.isAnnotationPresent(Class)
  • 获得注解
    • Class.getAnnotation(Class)
    • Field.getAnnotation(Class)
    • Method.getAnnotation(Class)
    • Constructor.getAnnotation(Class)