注解

108 阅读2分钟

注解

从JDK5开始,Java增加了注解,注解是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。 可以分为下面两类:

  • 元注解
  • 标准注解

元注解

用来注解其他注解,从而创建新的注解,可以简单理解为注解的注解。

分类:

  1. @Target:注解所作用的对象范围
  2. @Inherited:表示注解可以被继承
  3. @Documented:表示该注解会被JavaDoc工具记录
  4. @Retention:声明注解的保留策略
  5. @Repeatable:允许同个注解在同一声明类型(类、属性或方法)上多次使用,JDK 8 新增

注解@Target

注解@Target取值是一个ElementType类型的枚举,取值和其修饰的对象范围如下:

  • ElementType.TYPE:修饰类、接口或者枚举
  • ElementType.FIELD:修饰成员变量(包括枚举常量)
  • ElementType.METHOD:修饰方法
  • ElementType.PARAMETER:修饰参数
  • ElementType.CONSTRUCTOR:修饰构造方法
  • ElementType.LOCAL_VARIABLE:修饰局部变量
  • ElementType.ANNOTATION_TYPE:修饰注解
  • ElementType.PACKAGE:修饰包
  • ElementType.TYPE_PARAMETER:类型参数声明(JDK8新增)
  • ElementType.TYPE_USE:使用类型(JDK8新增)

注解@Retention

注解@Retention有3中类型,表示不同级别的保留策略:

  • RetentionPolicy.SOURCE:源码级注解,注解信息只会保留在.java源码中,在编译时注解信息会被编译器丢弃
  • RetentionPolicy.CLASS:编译时注解,注解信息保留在.java源码及.class中,当运行时JVM会丢弃该注解信息
  • RetentionPolicy.RUNTIME:运行时注解,运行时JVM也会保留该注解信息,可以通过反射获取该注解信息

标准注解

可以分为以下4中:

  • @Override:标记覆盖父类中的方法
  • @Deprecated:标记已过时或不鼓励使用的方法,如果使用了这些方法,编译时会有提示信息
  • @Suppress Warnings:选择性地取消特定代码段中的警告
  • @SafeVarargs:声明使用了可变长度参数的方法,在与泛型类一起使用时不会出现类型安全问题

注解定义

  1. 定义新的注解类型:使用@interface关键字,与定义一个接口类似;注解只有成员变量,没有方法;其成员变量以“无形参的方法”形式来声明,方法名即为该成员变量的名字,返回值即为该成员变量的类型;使用default关键字可以为其指定默认值。 以Retrofit的GET为例子
@Documented
@Target(METHOD)
@Retention(RUNTIME)
public @interface GET {
  String value() default "";
}

从上面的定义可以看出,该注解用于修饰方法,为运行时注解,定义了类型为String的成员变量value,默认值为空字符串“”