java annotation 詳解

在java的世界里面,不管是我們自己寫(xiě)代碼,亦或是看一些開(kāi)源框架的代碼掺逼,我們經(jīng)常會(huì)看到作者使用注解,注解是定義一些額外的信息或者是操作處理的手段瓤介,這就是注解的全部意義

注解的分類

Java 1.5中開(kāi)始引入的Annotation吕喘,類似于注釋解釋的一種技術(shù),我們常常使用它在代碼中來(lái)做一些注釋刑桑,并且在適當(dāng)(編譯代碼或運(yùn)行代碼等時(shí)機(jī))的時(shí)候氯质,對(duì)其進(jìn)行解釋,并且做一些額外的操作

我們先來(lái)了解一下java中已經(jīng)存在的那些注解和使用方式祠斧,然后我們?cè)龠M(jìn)行自定義注解操作和使用闻察。

內(nèi)置注解

我們?cè)陂_(kāi)發(fā)中,用得最多的Annotation莫過(guò)于@Override了梁肿。大家天天用蜓陌,可能很多人卻沒(méi)有關(guān)注過(guò)其背后的細(xì)節(jié),我們看一下它的定義:

// 方法注解吩蔑,表示此注解修飾的方法覆蓋了父類或是接口的方法
// 如果不是這樣钮热,則輸出警告
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

// 對(duì)于此注解所修飾的對(duì)象(類、域烛芬、方法等)
// 當(dāng)你使用了它們時(shí)編譯器將輸出“已廢棄”警告
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}

// 關(guān)閉警告隧期,通過(guò)給此注解的元素賦值
// 可以關(guān)閉特定警告
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

元注解

@Documented  // 標(biāo)志將此注解包含至javadoc中

// 定義注解保存級(jí)別
// 1.SOURCE 源代碼注解飒责,被編譯器丟棄
// 2.CLASS 類注解,被編譯器記錄在class文件中仆潮,運(yùn)行時(shí)被VM丟棄宏蛉,在編譯時(shí)使用,屬于默認(rèn)配置
// 3.RUNTIME 被編譯器記錄在class文件中性置,運(yùn)行時(shí)可用拾并,被VM保留,所以可以在運(yùn)行時(shí)搭配反射使用
@Retention(RetentionPolicy.RUNTIME)

// 定義注解適用的目標(biāo)
// 1.TYPE Class類鹏浅,接口(包括注解類型或者enum類型)
// 2.FIELD 屬性(包括enum實(shí)例)
// 3.METHOD 方法
// 4.PARAMETER 方法參數(shù)
// 5.CONSTRUCTOR 類構(gòu)造器
// 6.LOCAL_VARIABLE 本地變量
// 7.ANNOTATION_TYPE 注解類型
// 8.PACKAGE 包
@Target(ElementType.METHOD)

// 定義繼承類型嗅义,注解也允許繼承
@Inherited

在定義元注解的時(shí)候,@Target的值都是定義為ElementType.ANNOTATION_TYPE隐砸,例如:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)  // 目標(biāo)定義為注解類型
public @interface Retention {
    RetentionPolicy value();
}

自定義注解

// 定義運(yùn)行時(shí)使用策略
@Retention(RetentionPolicy.RUNTIME) 
// 適用目標(biāo)是類的成員變量
@Target(ElementType.FIELD)
public @interface DBField {
    String value() default "";  // default定義了默認(rèn)值之碗,此處為""
}

那么我們?nèi)绾问褂靡陨?種類型的注解呢?

舉幾個(gè)栗子

栗子1

public class ApplicantResult {
    @DBField(DBConstants.sign.SHEET_ID)
    long sheetId;
}

解釋:由于我們上面定義的DBField注解季希,使用是在成員變量使用褪那,所以這里我們?cè)?code>ApplicantResult類的屬性sheetId中使用,我們發(fā)現(xiàn)為什么不是使用@DBField(value=DBConstants.sign.SHEET_ID)呢式塌?
這里使用注解的過(guò)程中有幾個(gè)隱晦的使用規(guī)則

  1. 如果注解中定義了value元素
  2. 如果在使用注解時(shí)value是惟一需要賦值的元素
  3. 那么只需在括號(hào)內(nèi)給出value的值即可
  4. 如果沒(méi)有給相應(yīng)的注解賦值博敬,那么將使用注解中的默認(rèn)值,類似于@DBField()珊搀,value值默認(rèn)被賦予空值(即default "")

所以這里才有了我們簡(jiǎn)寫(xiě)的注解使用

栗子2

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}

對(duì)于元注解@Target冶忱,如果你希望一個(gè)注解可以作用于ElementType中的所有類型尾菇,那么就可以不使用@Target——@Deprecated就是這樣做的境析。

注解的使用

注解的使用,主要是依據(jù)@Retention的分類派诬,可以在源碼劳淆,編譯時(shí),運(yùn)行時(shí)默赂,結(jié)合不同的@Target配合使用沛鸵,我們下面主要講解一下注解有哪幾種使用場(chǎng)景

  1. 基于運(yùn)行時(shí)反射方式使用
    @Retention(RetentionPolicy.RUNTIME)
    參考我的另外一篇文章ButterKnife使用和原理
  2. 基于APT的注解處理工具(Java Annotation Processing Tools)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缆八,隨后出現(xiàn)的幾起案子曲掰,更是在濱河造成了極大的恐慌,老刑警劉巖奈辰,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栏妖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奖恰,警方通過(guò)查閱死者的電腦和手機(jī)吊趾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)宛裕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人论泛,你說(shuō)我怎么就攤上這事揩尸。” “怎么了屁奏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵岩榆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坟瓢,道長(zhǎng)朗恳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任载绿,我火速辦了婚禮粥诫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崭庸。我一直安慰自己怀浆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布怕享。 她就那樣靜靜地躺著执赡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪函筋。 梳的紋絲不亂的頭發(fā)上沙合,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音跌帐,去河邊找鬼首懈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谨敛,可吹牛的內(nèi)容都是我干的究履。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脸狸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼最仑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炊甲,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泥彤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卿啡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吟吝,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年牵囤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爸黄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞伟。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炕贵,靈堂內(nèi)的尸體忽然破棺而出梆奈,到底是詐尸還是另有隱情,我是刑警寧澤称开,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布亩钟,位于F島的核電站,受9級(jí)特大地震影響鳖轰,放射性物質(zhì)發(fā)生泄漏清酥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一蕴侣、第九天 我趴在偏房一處隱蔽的房頂上張望焰轻。 院中可真熱鬧,春花似錦昆雀、人聲如沸辱志。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)揩懒。三九已至,卻和暖如春挽封,著一層夾襖步出監(jiān)牢的瞬間已球,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工辅愿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留智亮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓渠缕,卻偏偏與公主長(zhǎng)得像鸽素,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亦鳞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容