最近想撸一个权限机制的APT项目,于是重新复习了注解的内容。
先简单看看Butterknife中对View的绑定的注解@BindView,源码如下
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface BindView {
int value();
}
其中对注解进行配置的是元注解,本文也将着重介绍这两个最常使用的元注解。
@Retention、@Target
@Retention
定义了该Annotation被保留的时间长短。参数为 RetentionPolicy
public enum RetentionPolicy {
SOURCE, //只在源码中存在,不存在编译后的.class 文件
CLASS, //默认配置,存在于源码,且编译后也存在.class中,但信息不会被加载到JVM虚拟机中
RUNTIME; //源码、class文件、虚拟机中都存在
private RetentionPolicy() {
}
}
类型 | 源码中存在 | CLASS文件中存在 | 是否加载到JVM虚拟机(Runtime) |
---|---|---|---|
SOURCE | 是 | 否 | 否 |
CLASS | 是 | 是 | 否 |
RUNTIME | 是 | 是 | 是 |
@Target
Target说明了Annotation所修饰的对象范围,参数为 ElementType
public enum ElementType {
TYPE, //用于描述类、接口(包括注解类型) 或enum声明
FIELD, //用于描述属性
METHOD, //用于描述方法
PARAMETER, //用于描述参数
CONSTRUCTOR, //用于描述构造函数
LOCAL_VARIABLE, //用于描述局部变量
ANNOTATION_TYPE, //用于描述注解
PACKAGE, //用于包
TYPE_PARAMETER, //描述类型,如泛型,String类型
TYPE_USE; //描述这个注解可以用在类型的声明式前
private ElementType() {
}
}
本文还未介绍的元注解还有
- @Document:说明该注解将被包含在javadoc中
- @Inherited:说明子类可以继承父类中的该注解