【轉(zhuǎn)】@interface 注解詳解

http://www.cnblogs.com/xdp-gacl/p/3622275.html

一萝嘁、認(rèn)識(shí)注解

  注解(Annotation)很重要奋单,未來的開發(fā)模式都是基于注解的泉褐,JPA是基于注解的降允,Spring2.5以上都是基于注解的禁荸,Hibernate3.x以后也是基于注解的,現(xiàn)在的Struts2有一部分也是基于注解的了葫录,注解是一種趨勢着裹,現(xiàn)在已經(jīng)有不少的人開始用注解了,注解是JDK1.5之后才有的新特性

JDK1.5之后內(nèi)部提供的三個(gè)注解

@Deprecated 意思是“廢棄的压昼,過時(shí)的

@Override 意思是“重寫求冷、覆蓋

@SuppressWarnings 意思是“壓縮警告

范例:注解的應(yīng)用:

總結(jié):注解(Annotation)相當(dāng)于一種標(biāo)記瘤运,在程序中加入注解就等于為程序打上某種標(biāo)記窍霞,沒有加,則等于沒有任何標(biāo)記拯坟,以后但金,javac編譯器、開發(fā)工具和其他程序可以通過反射來了解你的類及各種元素上有無何種標(biāo)記郁季,看你的程序有什么標(biāo)記冷溃,就去干相應(yīng)的事,標(biāo)記可以加在包梦裂、類似枕,屬性、方法年柠,方法的參數(shù)以及局部變量上凿歼。

  注解就相當(dāng)于一個(gè)你的源程序要調(diào)用一個(gè)類,在源程序中應(yīng)用某個(gè)注解冗恨,得事先準(zhǔn)備好這個(gè)注解類答憔。就像你要調(diào)用某個(gè)類,得事先開發(fā)好這個(gè)類掀抹。

二虐拓、自定義注解及其應(yīng)用

  自定義一個(gè)最簡單的注解:

用反射測試進(jìn)行測試AnnotationUse的定義上是否有@MyAnnotation。

三傲武、@Retention元注解

  根據(jù)反射的測試的問題蓉驹,引出@Retention元注解的講解:其三種取值:RetentionPolicy.SOURCE城榛、RetentionPolicy.CLASSRetentionPolicy.RUNTIME分別對(duì)應(yīng):Java源文件(.java文件)---->.class文件---->內(nèi)存中的字節(jié)碼

?四戒幔、 Retention注解說明

?   當(dāng)在Java源程序上加了一個(gè)注解吠谢,這個(gè)Java源程序要由javac去編譯,javac把java源文件編譯成.class文件诗茎,在編譯成class時(shí)可能會(huì)把Java源程序上的一些注解給去掉工坊,java編譯器(javac)在處理java源程序時(shí),可能會(huì)認(rèn)為這個(gè)注解沒有用了敢订,于是就把這個(gè)注解去掉了王污,那么此時(shí)在編譯好的class中就找不到注解了, 這是編譯器編譯java源程序時(shí)對(duì)注解進(jìn)行處理的第一種可能情況楚午,假設(shè)java編譯器在把java源程序編譯成class時(shí)昭齐,沒有把java源程序中的注解去掉,那么此時(shí)在編譯好的class中就可以找到注解矾柜,當(dāng)程序使用編譯好的class文件時(shí)阱驾,需要用類加載器把class文件加載到內(nèi)存中,class文件中的東西不是字節(jié)碼怪蔑,class文件里面的東西由類加載器加載到內(nèi)存中去里覆,類加載器在加載class文件時(shí),會(huì)對(duì)class文件里面的東西進(jìn)行處理缆瓣,如安全檢查喧枷,處理完以后得到的最終在內(nèi)存中的二進(jìn)制的東西才是字節(jié)碼,類加載器在把class文件加載到內(nèi)存中時(shí)也有轉(zhuǎn)換弓坞,轉(zhuǎn)換時(shí)是否把class文件中的注解保留下來隧甚,這也有說法,所以說一個(gè)注解的生命周期有三個(gè)階段:java源文件是一個(gè)階段渡冻,class文件是一個(gè)階段戚扳,內(nèi)存中的字節(jié)碼是一個(gè)階段,javac把java源文件編譯成.class文件時(shí),有可能去掉里面的注解族吻,類加載器把.class文件加載到內(nèi)存時(shí)也有可能去掉里面的注解帽借,因此在自定義注解時(shí)就可以使用Retention注解指明自定義注解的生命周期,自定義注解的生命周期是在RetentionPolicy.SOURCE階段(java源文件階段)呼奢,還是在RetentionPolicy.CLASS階段(class文件階段)宜雀,或者是在RetentionPolicy.RUNTIME階段(內(nèi)存中的字節(jié)碼運(yùn)行時(shí)階段),根據(jù)JDK提供的API可以知道默認(rèn)是在RetentionPolicy.CLASS階段 (JDKAPI寫到:the retention policy defaults to RetentionPolicy.CLASS.)

  下面看看@Deprecated握础、@Override辐董、@SuppressWarnings這三個(gè)注解的@Retention注解的屬性值分別是什么吧

4.1@Deprecated

  Java

API中是這樣定義的@Deprecated的

1@Documented

2 @Retention(value=RUNTIME)

3 public @interfaceDeprecated

4.2禀综、@Override

  Java

API中是這樣定義的@Override的

1@Target(value=METHOD)

2 @Retention(value=SOURCE)

3 public @interfaceOverride

  @Override是給javac(java編譯器)看的简烘,編譯完以后就@Override注解就沒有價(jià)值了苔严,@Override注解在源代碼中有用,編譯成.class文件后@Override注解就沒有用了孤澎,因此@Override的Retention的屬性值是RetentionPolicy.SOURCE

4.3届氢、@SuppressWarnings

  Java

API中是這樣定義的@SuppressWarnings的

1@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

2 @Retention(value=SOURCE)

3 public @interfaceSuppressWarnings

  @SuppressWarnings是給javac(java編譯器)看的,編譯器編譯完java文件后覆旭,@SuppressWarnings注解就沒有用了退子,所以@SuppressWarnings的Retention的屬性值是RetentionPolicy.SOURCE

五、@Target元注解

  @Target元注解決定了一個(gè)注解可以標(biāo)識(shí)到哪些成分上型将,如標(biāo)識(shí)在在類身上寂祥,或者屬性身上,或者方法身上等成分七兜,@Target默認(rèn)值為任何元素(成分)

例如:

1 @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

2@Retention(value=SOURCE)

3 public @interfaceSuppressWarnings

六丸凭、為注解增加屬性

  注解可以看成是一種特殊的類,既然是類腕铸,那自然可以為類添加屬性

6.1.添加屬性

 語法:類型 屬性名();

其實(shí)從代碼的寫法上來看惜犀,注解更像是一種特殊的接口,注解的屬性定義方式就和接口中定義方法的方式一樣狠裹,而應(yīng)用了注解的類可以認(rèn)為是實(shí)現(xiàn)了這個(gè)特殊的接口

6.2.應(yīng)用屬性

6.3.為屬性指定缺省值(默認(rèn)值)

  語法:類型 屬性名() default 默認(rèn)值;

6.4.value屬性

  如果一個(gè)注解中有一個(gè)名稱為value的屬性虽界,且你只想設(shè)置value屬性(即其他屬性都采用默認(rèn)值或者你只有一個(gè)value屬性),那么可以省略掉“value=”部分酪耳。

  例如:@SuppressWarnings("deprecation")

七浓恳、為注解增加高級(jí)屬性

7.1刹缝、數(shù)組類型的屬性

[if !supportLists]·????????[endif]增加數(shù)組類型的屬性:int[]arrayAttr() default {1,2,4};

[if !supportLists]·????????[endif]應(yīng)用數(shù)組類型的屬性:@MyAnnotation(arrayAttr={2,4,5})

[if !supportLists]·????????[endif]如果數(shù)組屬性只有一個(gè)值碗暗,這時(shí)候?qū)傩灾挡糠挚梢允÷源罄ㄌ?hào),如:@MyAnnotation(arrayAttr=2)梢夯,這就表示數(shù)組屬性只有一個(gè)值言疗,值為2

7.2.、枚舉類型的屬性

[if !supportLists]·????????[endif]增加枚舉類型的屬性:EumTrafficLamplamp() default EumTrafficLamp.RED;

[if !supportLists]·????????[endif]應(yīng)用枚舉類型的屬性:@MyAnnotation(lamp=EumTrafficLamp.GREEN)

7.3颂砸、注解類型的屬性

為注解添加一個(gè)注解類型的屬性,并指定注解屬性的缺省值:MetaAnnotation annotationAttr()default @MetaAnnotation("xdp");

八噪奄、注解綜合測試

EumTrafficLamp.java

MetaAnnotation.java

MyAnnotation.java

MyAnnotationTest.java

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市人乓,隨后出現(xiàn)的幾起案子勤篮,更是在濱河造成了極大的恐慌,老刑警劉巖色罚,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碰缔,死亡現(xiàn)場離奇詭異,居然都是意外死亡戳护,警方通過查閱死者的電腦和手機(jī)金抡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瀑焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梗肝,你說我怎么就攤上這事榛瓮。” “怎么了巫击?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵禀晓,是天一觀的道長。 經(jīng)常有香客問我坝锰,道長匆绣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任什黑,我火速辦了婚禮崎淳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愕把。我一直安慰自己拣凹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布恨豁。 她就那樣靜靜地躺著嚣镜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橘蜜。 梳的紋絲不亂的頭發(fā)上菊匿,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音计福,去河邊找鬼跌捆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛象颖,可吹牛的內(nèi)容都是我干的佩厚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼说订,長吁一口氣:“原來是場噩夢啊……” “哼抄瓦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陶冷,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤钙姊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后埂伦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞额,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了立镶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁袄。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖媚媒,靈堂內(nèi)的尸體忽然破棺而出嗜逻,到底是詐尸還是另有隱情,我是刑警寧澤缭召,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布栈顷,位于F島的核電站,受9級(jí)特大地震影響嵌巷,放射性物質(zhì)發(fā)生泄漏萄凤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一搪哪、第九天 我趴在偏房一處隱蔽的房頂上張望靡努。 院中可真熱鬧,春花似錦晓折、人聲如沸惑朦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漾月。三九已至,卻和暖如春胃珍,著一層夾襖步出監(jiān)牢的瞬間梁肿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工觅彰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吩蔑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓缔莲,卻偏偏與公主長得像哥纫,于是被迫代替她去往敵國和親霉旗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痴奏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,168評(píng)論 0 2
  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2厌秒、Retrofit解析...
    隔壁老李頭閱讀 6,511評(píng)論 4 31
  • 一读拆、認(rèn)識(shí)注解 注解(Annotation)很重要,未來的開發(fā)模式都是基于注解的鸵闪,JPA是基于注解的檐晕,Spring2...
    北牧蒼狼閱讀 256評(píng)論 0 1
  • 關(guān)于注解首先引入官方文檔的一句話:Java 注解用于為 Java 代碼提供元數(shù)據(jù)。作為元數(shù)據(jù),注解不直接影響你的代...
    編程小世界閱讀 465評(píng)論 0 0
  • java自定義注解 Java注解是附加在代碼中的一些元信息辟灰,用于一些工具在編譯惑申、運(yùn)行時(shí)進(jìn)行解析和使用鸣个,起到說明、配...
    尼爾君閱讀 519評(píng)論 0 0