前言#
這篇我覺得應(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é),如果你有其他的想法和理解,千萬不要忘記留言,眾人拾柴火焰高,大家一起努力,一定會找到更正確的答案。