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);
}