深入理解編譯注解(五)RetentionPolicy.SOURCE 和 RetentionPolicy.CLASS區(qū)別討論

前言#

這篇我覺得應(yīng)該是一個討論篇,因為我自己還沒有找到一個非常滿意的答案,希望大家一起來討論。

正文#

元注解RetentionPolicy,表明注解的生命周期:

1、SOURCE:在原文件中有效,被編譯器丟棄。
2、CLASS:在class文件有效,可能會被虛擬機(jī)忽略。
3、RUNTIME:在運行時有效。

RUNTIME肯定沒有意見,因為只有他能夠在運行時得到注解,例如之前的數(shù)據(jù)庫框架。那么SOURCE和CLASS呢?

他倆概念上的區(qū)別是 CLASS被編譯到.class文件中,SOURCE沒有,也很好理解。那么再仔細(xì)思考一下之前的編譯注解demo,如果換成是SOURCE行不信呢?我抱著試一試的心態(tài),運行了一下...

不試不知道,一試嚇一跳,臥草草,竟然運行完美????

然后我就懵逼了,既然運行無差別,那定義成CLASS有什么用?再冷靜的思考一下:

1、SOURCE 是在編譯之后被拋棄的,那么他存活的時間是在源碼和編譯中,所以我們的編譯處理器仍然能正常工作。

2、.class文件我們無法操作,這對于我們來說有什么意義?

于是我在網(wǎng)上了搜索了很多的資料,都沒有找到答案,于是和我的好基友討論了這個問題,最終得出了一個合情合理的答案:

首先我們知道android從源碼到apk文件的大體流程:

Java源碼 ---> Class文件 ---> Dex文件 ---> apk

也就是說CLASS的作用時間最多是在Class文件 ---> apk這個過程,這個過程是由android系統(tǒng)來進(jìn)行編譯和打包的,那么能夠操作CLASS注解的人,也就只有android系統(tǒng),換句話說,也就是來定制開發(fā)編譯過程的開發(fā)人員來做。

仔細(xì)一想,這樣應(yīng)該是合情合理,RetentionPolicy.SOURCE僅僅是給應(yīng)用層開發(fā)人員用的,RetentionPolicy.CLASS 需要應(yīng)用層和底層系統(tǒng)開發(fā)人員配合使用的,所以僅僅是應(yīng)用層開發(fā)的我們是一臉懵逼,意識CLASS和SOURCE的區(qū)別。

順便說一句,自定義注解默認(rèn)是RetentionPolicy.CLASS,看的出來Java是推薦把注解放到.class中去的。

總結(jié)#

這是我的思考和總結(jié),如果你有其他的想法和理解,千萬不要忘記留言,眾人拾柴火焰高,大家一起努力,一定會找到更正確的答案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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