本文共 1730 字,大约阅读时间需要 5 分钟。
RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
源码注解(RetentionPolicy.SOURCE)的生命周期只存在Java源文件这一阶段,是3种生命周期中最短的注解。当在Java源程序上加了一个注解,这个Java源程序要由javac去编译,javac把java源文件编译成.class文件,在编译成class时会把Java源程序上的源码注解给去掉。需要注意的是,在编译器处理期间源码注解还存在,即注解处理器Processor 也能处理源码注解,编译器处理完之后就没有该注解信息了。示例:
package com.mazaiting.annotiontest;import android.support.annotation.IntDef;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author mazaiting * @date 2018/1/16 */public class SourceAnnotation { /**状态值*/ public static final int STATUS_OPEN = 1; public static final int STATUS_CLOSE = 2; public static int mStatus = STATUS_OPEN; public static int getStatus() { return mStatus; } public static void setStatus(@Status int status) { mStatus = status; } public static String getStatusDesc() { if (mStatus == STATUS_OPEN) { return "打开状态"; } else { return "关闭状态"; } } @Retention(RetentionPolicy.SOURCE) @Target(ElementType.PARAMETER) @IntDef({STATUS_OPEN,STATUS_CLOSE}) public @interface Status { }}
定义了一个@Status注解,并用注解@IntDef限定了取值范围,最后将@Status注解用在参数上就行了,这样在使用调用方法的使用只能使用指定的参数{STATUS_OPEN, STATUS_CLOSE},就算用数值1编译器也会提示报错。除了@IntDef注解外还用一个@StringDef注解可以使用,用来处理字符串。
使用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 报错Must be one of: SourceAnnotation.STATUS_OPEN, SourceAnnotation.STATUS_CLOSE// SourceAnnotation.setStatus(1); /**源码注解*/ SourceAnnotation.setStatus(SourceAnnotation.STATUS_OPEN); }
转载地址:http://xkfna.baihongyu.com/