注解

  • 标准注解
    • @Override 对覆盖超类中的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告
      @Deprecated 对不鼓励使用或者已过时的方法添加注解
      @SuppressWarnings 选择性地取消特定代码段中的警告
      @SafeVarargs jdk7新增,用来声明使用了可变长度参数的方法,其在与泛类型一起使用时不会出现类型安全问题
      
  • 元注解
    • 注解的注解,元注解有以下几种:
      • @Target 注解所修饰的对象范围 
        • 范围有以下几种
          public enum ElementType {
              ANNOTATION_TYPE,
              CONSTRUCTOR,
              FIELD,
              LOCAL_VARIABLE,
              METHOD,
              PACKAGE,
              PARAMETER,
              TYPE,
              TYPE_PARAMETER,
              TYPE_USE;
          }
          
    •   @Inherited 表示注解可以被继承
      
    •  @Documented 表示这个注解应该被JavaDoc工具记录
      
    • @Retention 用来声明注解的保留策略
      

        有三种策略类型:

      public enum RetentionPolicy {
          CLASS,
          RUNTIME,
          SOURCE;
      
          private RetentionPolicy() {
          }
      }
      
      SOURCE源码级注解,注解信息只会保留在java源码中,源码在编译后,注解信息会被丢弃,不会保留在.class中
      
      CLASS编译时注解。注解信息会保留在.java以及。class中,当运行java程序时,jvm会丢弃该注解信息,不会保留在jvm中
      
      RUNTIME运行时注解。当运行java程序时,jvm也会保留该注解信息可以通过反射获取该注解信息
      
    •  @Repeatable jdk8新增,允许一个注解在同一声明类型(类、属性或方法)上多次使用
      

 

  • 定义注解
  1. 基本定义:
    public @interface Swordsman {
    
    }
    

      

    1. 定义完注解就可以在程序中使用该注解
      @Swordsman
      public class AnnotationTest {
      

        

        
  2. 定义成员变量
    public @interface Swordsman {
        String name();
        int age();
    }
    

     

    1. 使用该注解时就该该注解的成员变量指定值
      @Swordsman(name="张无忌",age=23)
      public class AnnotationTest {
      }
      

        

    2. 也可以在定义注解的成员变量时,使用default关键字为其指定默认值
      public @interface Swordsman {
          String name() default "张无忌";
          int age() default 12;
      }
      

        

      1. 因为注解定义了默认值,所以使用时可以不为这些成员变量指定值,而是直接使用默认值
        @Swordsman
        public class AnnotationTest {
        }
        

          

          
  3. 定义运行时注解
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Swordsman {
        String name() default "张无忌";
        int age() default 12;
    }
    

      

  4. 定义编译时注解
    @Retention(RetentionPolicy.CLASS)
    public @interface Swordsman {
        String name() default "张无忌";
        int age() default 12;
    }
    

     

  5. 可以用@Rention来设定注解的保留策略,这3个策略的生命周期长度为SOURCE<CLASS<RUNTIME.生命周期短的能起作用的地方,生命周期长的也一定能起作用。一般如果需要再运行时去动态获取注解信息,那只能用RentionPolicy.RUNTIME;r如果要在编译时进行一些预处理操作,比如生成一些辅助代码,就用CLASS;如果只是做一些检查性的操作,比如@Override和SuppressWarnings,则可选用SOURCE

posted on 2018-05-28 15:53  endian11  阅读(98)  评论(0编辑  收藏  举报

导航