#Java基础# 注解

166 阅读2分钟

注解的类型

预定义的注解

1. 用于语言的注解
注解名注解含义
@Deprecated方法已弃用
@Override重写父类方法
@SuppressWarnings阻断警告提示
@SafeVarargs声明代码存在不安全的操作
@FunctionalInterface函数式接口声明
2. 用于注解的注解
注解名注解含义可选值
@Retention说明注解保留到什么阶段RetentionPolicy.SOURCE, RetentionPolicy.CLASS , RetentionPolicy.RUNTIME
@Documented表明注解要被记录到 Javadoc 文档中注解默认是不记录到 Javadoc
@Target表明被标注该注解的注解可以用在什么地方ElementType.ANNOTATION_TYPE , ElementType.CONSTRUCTOR , ElementType.FIELD , ElementType.LOCAL_VARIABLE , ElementType.METHOD ,ElementType.PACKAGE, ElementType.PARAMETER , ElementType.TYPE
@Inherited表明子类可以用父类继承注解类型--
@Repeatable表明注解为重复注解可多次使用到同一个位置

自定义的注解

注解的声明

1. 声明一个重复注解
 1.1 必须要使用 @Repeatable 元注解,如下
    import java.lang.annotation.Repeatable;
    @Repeatable(Schedules.class) // 需要使用容器来存放多个注解,所以要包含注解类 Schedules
    public @interface Schedule {
      String dayOfMonth() default "first";
      String dayOfWeek() default "Mon";
      int hour() default 12;
    }
 1.2 需要声明一个容器注解类,如
 
public @interface Schedules {
    Schedule[] value();
}

注解的设计

注意事项

  • 注意注解的可使用次数
    • 如标记了@Repeatable 的注解允许使用两次及两次以上;没有标记@Repeatable 则最多允许使用一次
  • 注意注解的使用范围
    • 如标记了@Target( {ElementType.METHOD, ElementType.FIELD} ) 的注解,即只可在方法或属性上使用该注解

注解的变化

分界版本

  • Java SE 8 之前
    • 只可以用在声明上
    • 没有提供类型检查框架
  • Java SE 8 之后
    • 几乎可用在任何类型上

    • 允许编写类型检查框架,如西雅图华盛顿大学的类型检查框架

      • 常用于校验框架,如 @NonNull 检查 NullPointerException
    • 允许使用重复注解,如:

      @Schedule(dayOfMonth="last") // 第一次指定了是月的那一天
      @Schedule(dayOfWeek="Fri", hour="23") // 第二次指定了星期几和什么时候
      public void doPeriodicCleanup() { ... }
      

检索注解

注解的获取

  • 使用反射机制取得类的单个注解,如AnnotatedElement.getAnnotation(Class<T>)

  • 取得类的所有注解,如AnnotatedElement.getAnnotationsByType(Class<T>)

  • 更多关于AnnotatedElement 的方法可查阅 AnnotatedElement