注解
从JDK5开始,Java增加了注解,注解是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。 可以分为下面两类:
- 元注解
- 标准注解
元注解
用来注解其他注解,从而创建新的注解,可以简单理解为注解的注解。
分类:
- @Target:注解所作用的对象范围
- @Inherited:表示注解可以被继承
- @Documented:表示该注解会被JavaDoc工具记录
- @Retention:声明注解的保留策略
- @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:声明使用了可变长度参数的方法,在与泛型类一起使用时不会出现类型安全问题
注解定义
- 定义新的注解类型:使用@interface关键字,与定义一个接口类似;注解只有成员变量,没有方法;其成员变量以“无形参的方法”形式来声明,方法名即为该成员变量的名字,返回值即为该成员变量的类型;使用default关键字可以为其指定默认值。 以Retrofit的GET为例子
@Documented
@Target(METHOD)
@Retention(RUNTIME)
public @interface GET {
String value() default "";
}
从上面的定义可以看出,该注解用于修饰方法,为运行时注解,定义了类型为String的成员变量value,默认值为空字符串“”