java自定义注解

来源:互联网 发布:天佑鲍比知乎 编辑:程序博客网 时间:2024/06/09 23:36

注解(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;}// Usagepublic 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@Usagepublic 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 })@Inheritedpublic @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};}// Usagepublic 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.csdn.net/snow_crazy/article/details/39381695测试代码和结果。