java注解

注解是什么

  • Annotation的作用
    • 不是程序本身,可以对程序做出解释(与注释(comment)一样)
    • 可以被其他程序(编译器等)读取
    • 有检查,约束等作用
  • Annotation的格式
    • 以@“注释名”在代码中存在,可以添加参数值
  • Annotation使用的地方
    • 可以附加在package,class,method,field上面,相当于添加了额外的辅助信息,可以通过反射机制编程实现多这些元数据的访问
  • 注解就是一个接口,内容就是接口方法,解析时通过调用方法获取值

内置注解

  • @Override
    • 只用于修饰方法
    • 表示一个方法打算重写或者实现超类中的另一个方法的声明
  • @Deprecated
    • 修饰方法、类、属性
    • 表示不鼓励程序员使用这样的元素,通常很危险或者存在更好的选择
  • @SuppressWarnings
    • 用于抑制编译是的警告信息
    • 需要添加参数才能使用,参数都是定义好的,选择性的使用就好了
    • 参数:@SuppressWarnings("all"),@SuppressWarnings("unchecked"),@SuppressWarnings(values={"unchecked","deprecation"})

元注解

  • 负责注解其他注解
  • java定义4个标准的meta-annotation类型,用来对其他annotation类型做说明
  • z元注解类型和所支持的类可以在java.lang.annotation中找到
    • @Target: 描述注解的使用范围
    • @Retention:表示需要在什么级别保存注解信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME
    • 前面有提到注解按生命周期来划分可分为3类:
      • SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
      • CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
      • RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
      • 这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
      • 首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
    • @Document: 说明该注解将包含在javadoc中
    • @Inherited: 说明子类可以继承父类中的注解

自定义注解

  • 使用@interface自定义注解,自动继承了java.lang.annotation.Annotation接口

    • @interface用来声明一个注解,格式:public @interface 注解名{...}

    • 其中每一个方法实际上是声明了一个配置参数

    • 方法的名称就是参数的名称

    • 返回值类型就是参数的类型(返回值只能是class,string,enum)

    • 通过default来声明参数的默认值

    • 只有一个参数成员,一般参数名为value,因此在注解里面可以省略(value)

    • 注解元素必须要有值,经常使用空字符串,0作为默认值

    • public class test03 {
      
          //注解可以显示赋值,没有默认值必须赋值
          @MyAnotation
          public void  test() {
      
          }
      }
      
      //使用范围
      @Target({ElementType.METHOD,ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @interface  MyAnotation{
          ///注解的参数:参数类型+参数名()
          String name() default "";
          int age() default 0;
          int id() default -1;  //默认值为-1,代表找不到
          String[] shcools() default {"清华","华科"};
      }
      
      //单个值
      @Target({ElementType.METHOD,ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @interface  MyAnotation2{
          String value() default "";
      }
      
上一篇:JDK8接口新特性


下一篇:中介者设计模式 学习笔记