天天看點

Android 自定義注解之源碼注解(RetentionPolicy.SOURCE)

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

繼續閱讀