Java注解

一辰妙、注解介紹

Java注解(Annotation)又稱 Java 標(biāo)注鹰祸。Java 語(yǔ)言中的類、方法密浑、變量蛙婴、參數(shù)和包等都可以被標(biāo)注。

1.1肴掷、注解寫法

格式:

@Target 注解標(biāo)注的目標(biāo):類敬锐、方法背传、變量呆瞻、參數(shù)和包等
@Retention 作用域:源碼、編譯時(shí)径玖、運(yùn)行時(shí)
public @interface 注解名稱{
    屬性列表;
}

注解通過(guò) @interface 關(guān)鍵字進(jìn)行定義痴脾,如下,定義一個(gè)MyAnnotation的注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    int value() default -1;
    String name();
}

@Target梳星、@Retention赞赖,也是元注解,元注解是可以注解到注解上的注解冤灾。

@Target

Target 目標(biāo)前域,限定注解了標(biāo)注的地方。取值如下:

  • ElementType.ANNOTATION_TYPE 可以給一個(gè)注解進(jìn)行注解
  • ElementType.CONSTRUCTOR 可以給構(gòu)造方法進(jìn)行注解
  • ElementType.FIELD 可以給屬性進(jìn)行注解
  • ElementType.LOCAL_VARIABLE 可以給局部變量進(jìn)行注解
  • ElementType.METHOD 可以給方法進(jìn)行注解
  • ElementType.PACKAGE 可以給一個(gè)包進(jìn)行注解
  • ElementType.PARAMETER 可以給一個(gè)方法內(nèi)的參數(shù)進(jìn)行注解
  • ElementType.TYPE 可以給一個(gè)類型進(jìn)行注解韵吨,比如類匿垄、接口、枚舉

@Target 可以給多個(gè)值,注解到多個(gè)地方椿疗,如

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

@Retention

Retention 英文意為保留漏峰,標(biāo)識(shí)注解作用域,在什么時(shí)候有效届榄。取值如下:

  • RetentionPolicy.SOURCE 注解只在源碼階段保留浅乔,并被編譯器忽略。
  • RetentionPolicy.CLASS 注解在源碼階段铝条、編譯器進(jìn)行編譯時(shí)保留靖苇,它并不會(huì)被加載到 JVM 中。
  • RetentionPolicy.RUNTIME 注解在源碼階段攻晒、編譯器進(jìn)行編譯顾复、運(yùn)行時(shí)保留,運(yùn)行時(shí)鲁捏,它會(huì)被加載進(jìn)入到 JVM 中芯砸,所以在程序運(yùn)行時(shí)可以獲取到它們。

SOURCE < CLASS < RUNTIME给梅,即CLASS包含了SOURCE假丧,RUNTIME包含SOURCE、CLASS动羽。

@interface

定義注解時(shí)包帚,用@interface定義

注解的屬性

注解可以定義一些屬性,如value运吓、name:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    int value() default -1;
    String name();
}

default 指定了默認(rèn)值

1.2渴邦、注解的使用

我們定義一個(gè)注解,簡(jiǎn)單的使用拘哨,如下:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    int value() default -1;
}


//使用注解 MyAnnotation
public class MyAnnotationTest {

    @MyAnnotation(value = 1)
    private int age;

    @MyAnnotation
    private int age1;
    
    ......
}

Android元注解的使用

在Android中谋梭,系統(tǒng)源碼幫我們定了一些元注解,如:IntDef, LongDef, StringDef倦青,可以限定參數(shù)的取值范圍瓮床,可以減少使用枚舉,減少內(nèi)存产镐。

如隘庄,我們定義一個(gè)星期:

    public static final int Sunday = 0;
    public static final int Monday = 1;
    public static final int Tuesday = 2;
    public static final int Wednesday = 3;
    public static final int Thursday = 4;
    public static final int Friday = 5;
    public static final int Saturday = 6;
    

再定義一個(gè)注解,限定使用這個(gè)注解時(shí)的取值癣亚,若不是限定的值丑掺,則源碼就會(huì)報(bào)紅:

    @IntDef({Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday})
    @Target({ElementType.PARAMETER, ElementType.FIELD})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Week {
    }

注解Week的使用:

    @Week
    private static int weekDay = Saturday;

    public static void setWeekDay(@Week int weekDay){
        AnnotationUsageDemo.weekDay = weekDay;
    }
    
    
    public static void main(String[] args) {
        //報(bào)紅,須使用:Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
        //setWeekDay(5);

        //正確
        setWeekDay(Friday);
    }

不使用限定值述雾,報(bào)紅街州,如圖:

1.png

1.3蓬豁、注解的用法

注解單獨(dú)使用是沒(méi)有意義的,常見(jiàn)的用法:

  • 注解+開(kāi)發(fā)工具(AS)菇肃,用于源碼期地粪,做一些代碼校驗(yàn)等,如注解:ResId琐谤、IntDef等
  • 注解+APT 用于編譯期時(shí)生成一些代碼文件蟆技,如:butterknife、dagger2斗忌、hilt质礼、databinding
  • 注解+字節(jié)碼操作 用于編譯時(shí)字節(jié)碼插樁,如:AspectJ织阳、ARounter眶蕉、CC
  • 注解+反射 代碼運(yùn)行時(shí),通過(guò)反射唧躲,進(jìn)行相應(yīng)的處理造挽,如:XUtils、Lifecycle
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弄痹,一起剝皮案震驚了整個(gè)濱河市饭入,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肛真,老刑警劉巖谐丢,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚓让,居然都是意外死亡乾忱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門历极,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窄瘟,“玉大人,你說(shuō)我怎么就攤上這事执解∧ぃ” “怎么了纲酗?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵衰腌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我觅赊,道長(zhǎng)右蕊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任吮螺,我火速辦了婚禮饶囚,結(jié)果婚禮上帕翻,老公的妹妹穿的比我還像新娘。我一直安慰自己萝风,他們只是感情好嘀掸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著规惰,像睡著了一般睬塌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歇万,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天揩晴,我揣著相機(jī)與錄音,去河邊找鬼贪磺。 笑死硫兰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宰掉,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禽最,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苏研?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腮郊,失蹤者是張志新(化名)和其女友劉穎摹蘑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧飞,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衅鹿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了过咬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大渤。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掸绞,靈堂內(nèi)的尸體忽然破棺而出泵三,到底是詐尸還是另有隱情,我是刑警寧澤衔掸,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布烫幕,位于F島的核電站,受9級(jí)特大地震影響敞映,放射性物質(zhì)發(fā)生泄漏较曼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一振愿、第九天 我趴在偏房一處隱蔽的房頂上張望捷犹。 院中可真熱鬧弛饭,春花似錦、人聲如沸萍歉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枪孩。三九已至横蜒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間销凑,已是汗流浹背丛晌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斗幼,地道東北人澎蛛。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜕窿,于是被迫代替她去往敵國(guó)和親谋逻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 什么是注解桐经? Annontation(注解)是Java5開(kāi)始引入的新特征毁兆。它提供了一種安全的類似注釋的機(jī)制,用來(lái)將...
    星星_點(diǎn)燈閱讀 1,145評(píng)論 0 1
  • Annotation 中文譯過(guò)來(lái)就是注解阴挣、標(biāo)釋的意思气堕,在 Java 中注解是一個(gè)很重要的知識(shí)點(diǎn),但經(jīng)常還是有點(diǎn)讓新...
    as_pixar閱讀 287評(píng)論 0 0
  • 原作者:frank909原博客鏈接:秒懂,Java 注解 (Annotation)你可以這樣學(xué) 文章開(kāi)頭先引入一處...
    駭客與畫家閱讀 2,493評(píng)論 4 59
  • 注解如同標(biāo)簽 初學(xué)者可以這樣理解注解:想像代碼具有生命誓沸,注解就是對(duì)于代碼中某些鮮活個(gè)體的貼上去的一張標(biāo)簽梅桩。簡(jiǎn)化來(lái)講...
    哦00閱讀 542評(píng)論 0 0
  • 本文將圍繞下面三個(gè)問(wèn)題展開(kāi): 1.Annotation是什么?2.有什么作用拜隧?3.學(xué)習(xí)理解它有什么好處宿百? 1.An...
    TangBuzhi閱讀 362評(píng)論 0 0