java自定义注解

注解(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值