自定义注解

注解的基础

  1. 注解的定义
    用@interface表示
  2. 元注解
    java.lang.annotation提供了四种元注解,专门注解其他的注解。分别为@Retention、@Target、@Document、@Inherited
  3. @Retention——注解的生命周期
    • @Retention(RetentionPolicy.SOURCE):在编译阶段丢弃,仅存在于源码中。在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
    • @Retention(RetentionPolicy.CLASS):类加载时被丢弃,默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。
    • @Retention(RetentionPolicy.RUNTIME):始终不会被丢弃,注解会在class字节码文件中存在,在运行时可以通过反射获取到。我们自定义的注解通常使用这种方式。
  4. @Target——注解的作用目标
    @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) // 包
  5. @Document——表示是否将注解信息添加在javadoc中
  6. @Inherited——定义该注释和子类的关系
    @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
    意思就是:一个子类想获取到父类上的注解信息,那么必须在父类上使用的注解上面加上@Inherited关键字

    编写规则

    自定义注解类编写的一些规则:
    1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.
    2. 参数成员只能用public或默认(default)这两个访问权修饰
    3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.
    4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法
    5. 注解也可以没有定义成员
      PS:自定义注解需要使用到元注解

      自定义注解实例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      @Target(FIELD)
      @Retention(RUNTIME)
      @Documented
      public @interface FruitColor {
      /**
      * 颜色枚举
      */
      public enum Color{ BLUE,RED,GREEN};

      /**
      * 颜色属性
      */
      Color fruitColor() default Color.GREEN;
      }
1
2
3
4
5
//注解的使用
public class Apple {
@FruitColor(fruitColor=Color.RED)
private String appleColor;
}