Files
rikako-note/java se/java注解.md
2022-06-11 23:44:13 +08:00

3.0 KiB
Raw Permalink Blame History

Java Annotation

  • Java注解格式

    • @annotation_name(element_name1=value_1,element_name2=value_2...)
    • 注解可以没有element如果一个注解没有element那么该注解的括号可以被省略例如@Override
    • 如果注解只有一个叫做value的元素那么value的名称可以被省略例如@SuppressWarnings("unchecked")
    • 对于同一个类,可以为其声明多个注解,例如
      @RequestMapping("/hello")
      @ResponseBody
      String hello() {return "hello world";}
      
  • 注解类型的定义:

    • 注解类型可以用如下方式来定义:
      @interface ClassMessage {
          String author();
          String date();
          // 可以为注解中的element定义默认值
          int currentRevision() default 1;
          String[] reviewers();
      }
      
  • jdk中预定义的java注解

    • @Deprecated
      • 被该注解标明的类、方法、域会被标记为不推荐的,再使用这些方法时编译器会生成警告
      • 标记为@Deprecated的元素再java doc中也应该使用@deprecated标记其为被抛弃的
    • @Override
      • 标明该方法会覆盖父类中的同名方法
    • @SuppressWarnings(warnings)
      • 抑制警告
      • 如果要抑制多个警告,可使用如下方法
        @SuppressWarnings({"unchecked","deprecation"}
        )
        
    • @Retention:
      • 用来标注在注解上,用来表明该注解如何被存储
      • 该注解有如下值:
        • RetentionPolicy.SOURCE:
          • 该注解被保存在源码层面,并且会被编译器所忽视
        • Retention.CLASS:
          • 该注解在编译时被编译器所保存但是会被jvm忽略
        • Retention.RUNTIME:
          • 该注解被jvm保存并且在运行时可以被使用
    • @Target:
      • 该注解标注在注解上,指明注解应该应用于哪些位置
      • 在使用时,应该为@Target的value指定如下值
        • ElementType.ANNOTATION_TYPE
        • ElementType.CONSTRUCTOR
        • ElementType.FILED
        • ElementType.LOCAL_VARIABLE
        • ElementType.METHOD
        • ElementType.PACKAGE
        • ElementType.Parameter
        • ElementType.TYPE (可用于类型、接口(包括注解)、枚举)
    • @Inherited
      • 该注解标注在注解上,如果一个注解被标明为继承的,那么该注解标明的父类,其子类即使没有被注解标明,在查询该子类的注解类型时也会返回父类的注解
    • @Repeatable
      • 标明一个注解可以多次重复的应用到同一个类、方法上
  • 可重复注解

    • 如果想要将一个注解标名为可重复的,需要有如下两个步骤
      • 为注解标明@Repatable并且在括号中指明容器注解
      • 在指定的容器注解中添加可重复注解的数组返回类型
    • 样例
      @Repatable(Timers.class)
      @interface Timer {
          String time() default "0:00";
      }
      
      @interface Timers {
          Timer[] value();
      }