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

http://blog.csdn.net/github_35180164/article/details/52119731

源碼注解(RetentionPolicy.SOURCE)的生命周期只存在Java源文件這一階段,是3種生命周期中最短的注解。當(dāng)在Java源程序上加了一個(gè)注解,這個(gè)Java源程序要由javac去編譯,javac把java源文件編譯成.class文件,在編譯成class時(shí)會(huì)把Java源程序上的源碼注解給去掉。需要注意的是,在編譯器處理期間源碼注解還存在,即注解處理器Processor 也能處理源碼注解,編譯器處理完之后就沒有該注解信息了。
(關(guān)于注解處理器Processor的詳細(xì)用法放在編譯時(shí)注解RetentionPolicy.CLASS里說(shuō)明,或則可以先看這個(gè):Java注解處理器使用詳解
在這里就不用注解處理器來(lái)處理源碼注解了,來(lái)看一個(gè)我之前看到的挺有用的用法。
自定義注解
在開始寫注解前,先來(lái)考慮我們平時(shí)會(huì)遇到的一種情況:
我們定義的類有一個(gè) int 型的狀態(tài)參數(shù)要設(shè)置,但我們?cè)O(shè)置的狀態(tài)又只能限定在[OPEN=1, CLOSE=2]這兩種狀態(tài),如果我們要提供一個(gè)接口來(lái)設(shè)置的話,那么一種做法是定義一個(gè)Enum枚舉來(lái)作為參數(shù),這樣就能限定參數(shù)的取值范圍了,但是使用枚舉會(huì)比常量占用更多的內(nèi)存。
這里可以用注解來(lái)處理這種問題,也就是下面要講的自定義源碼注解,這里需要用到一個(gè)元注解@IntDef,來(lái)看下代碼:

/** 
 * 測(cè)試源碼注解 
 */  
public class TestSourceAnnotation {  
  
    // 狀態(tài)值  
    public static final int STATUS_OPEN = 1;  
    public static final int STATUS_CLOSE = 2;  
  
    private static int sStatus = STATUS_OPEN;  
  
  
    private TestSourceAnnotation() {}  
  
  
    // 定義適用于參數(shù)的注解,限定取值范圍為{STATUS_OPEN, STATUS_CLOSE}  
    @Retention(RetentionPolicy.SOURCE)  
    @Target(ElementType.PARAMETER)  
    @IntDef({STATUS_OPEN, STATUS_CLOSE})  
  
    public @interface Status {  
    }  
  
    /** 
     * 定義方法并使用@Status限定參數(shù)的取值 
     * @param status 
     */  
    public static void setStatus(@Status int status) {  
        sStatus = status;  
    }  
  
    public static int getStatus() {  
        return sStatus;  
    }  
  
  
    public static String getStatusDesc() {  
        if (sStatus == STATUS_OPEN) {  
            return "打開狀態(tài)";  
        } else {  
            return "關(guān)閉狀態(tài)";  
        }  
    }  
}  

這里定義了一個(gè)@Status注解,并用注解@IntDef限定了取值范圍,最后將@****Status注解用在參數(shù)上就行了,這樣在使用調(diào)用方法的使用只能使用指定的參數(shù){STATUS_OPEN, STATUS_CLOSE},就算用數(shù)值1編譯器也會(huì)提示報(bào)錯(cuò)。除了@IntDef注解外還用一個(gè)@StringDef注解可以使用,用來(lái)處理字符串。
看下使用代碼:

/** 
 * 測(cè)試源碼注解 
 */  
private void _testSourceAnnotation() {  
    if (mIsOpen) {  
//            TestSourceAnnotation.setStatus(1); 直接設(shè)置數(shù)值編譯器會(huì)直接提示錯(cuò)誤  
        TestSourceAnnotation.setStatus(TestSourceAnnotation.STATUS_CLOSE);  
        mIsOpen = false;  
    } else {  
        TestSourceAnnotation.setStatus(TestSourceAnnotation.STATUS_OPEN);  
        mIsOpen = true;  
    }  
  
    mTvDesc.setText(TestSourceAnnotation.getStatusDesc());  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,300評(píng)論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,284評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評(píng)論 19 139
  • 在他的人生之火幾乎就要熄滅時(shí),老師為他燃起了一支蠟燭…… 那一年,他念高三。他父母都是農(nóng)民,吃苦耐勞,掙的...
    歡喜軒閱讀 466評(píng)論 0 5
  • 兒時(shí)夢(mèng)想,舊時(shí)乾坤。二十載,天南海北。憶往昔,歲月如歌。陡相見,人過半百。相擁時(shí),淚灑衣襟。說(shuō)不完的春花秋月,道不...
    阿杜阿云閱讀 125評(píng)論 0 1

友情鏈接更多精彩內(nèi)容