注解(Annotation),也叫元数据,一种代码级别的说明。JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释。
注解作用:
- 编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
- 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
- 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查
下面看下几个自定义注解及其使用范例:
// Sample1
// Define
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
}
// Usage
public class BusinessActivity extends AppCompatActivity {
....
// Called in Android ui main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
}
// Sample2
// Define@Usage
public class MultiStateView extends FrameLayout {
public static final int STATE_UNKNOWN = -1;
....
@Retention(RetentionPolicy.SOURCE)
@IntDef({STATE_UNKNOWN, STATE_PRELODING_CONTENT, STATE_LODING_CONTENT,
STATE_POSTLODING_CONTENT, STATE_POSTLODING_EMPTY, STATE_NONETWORK,
STATE_SERVER_EXCEPTION, STATE_OTHER_EXCEPTION})
public @interface ViewState {
}
public void setViewState(@ViewState int state) {
....
}
}
// Sample3
// Define
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
@Inherited
public @interface RequestHeader {
String TIMESTAMP = "Timestamp";
String APPKEY = "AppKey";
String ACCOUNT_ID = "AccountID";
String AUTHCODE = "AuthCode";
....
String[] value() default {RequestHeader.APPID, RequestHeader.SIGN, RequestHeader.VERSIONCODE, RequestHeader.REQUESTID, RequestHeader.LANGUAGE};
}
// Usage
public class AuthCodeRequest extends CommonJsonRequest<AuthCodeData> {
@RequestHeader(RequestHeader.TIMESTAMP)
public String timeStamp;
}
- @Interface声明这是自定义注解
- @Documented声明这是一个标记注解,没有成员,可以被例如javadoc此类的工具文档化
- @Retention声明该Annotation被保留的时长, 默认RetentionPoicy.CLASS
选项 | 说明 |
---|---|
RetentionPolicy.SOURCE | 注解将被编译器丢弃 |
RetentionPolicy.CLASS | 编译器将注解记录到class文件中,运行期VM并不保留注解信息 |
RetentionPolicy.RUNTIME | 编译器将注解记录到class文件中,同时运行期VM也会保留注解,所以注解可以通过反射读取 |
- @Target定义了该Annotation所修饰的类型
选项 | 说明 |
---|---|
ElementType.TYPE | 注解Class、interface(包含注解类型)、enum |
ElementType.FIELD | 注解成员变量 |
ElementType.METHOD | 注解成员方法 |
ElementType.PARAMETER | 注解正式参数(Formal parameter declaration) |
ElementType.CONSTRUCTOR | 注解构造器 |
ElementType.LOCAL_VARIABLE | 注解局部变量 |
ElementType.ANNOTATION_TYPE | 注解注解类型 |
ElementType.PACKAGE | 注解包 |
ElementType.TYPE_PARAMETER | 注解传参类型(type parameter)(JDK1.8新增&hide) |
ElementType.TYPE_USE | 注解类型使用(use of a type)(JDK1.8新增&hide) |
- @Inherited声明允许子类继承父类的注解。具体测试可参考http://blog.youkuaiyun.com/snow_crazy/article/details/39381695测试代码和结果。