Java自定義注解

概念

  • 作用在類沃缘、方法、成員變量上
  • 業(yè)務(wù)邏輯無關(guān)则吟,有類似切面的概念槐臀,起輔助作用
  • 可以在編譯和運行時起作用

作用

  • 生成文檔。@Param, @Return, @Author, 這些是出現(xiàn)在注釋里的
  • 編譯時檢查氓仲,如@Override 注在方法上會檢查該方法是否覆蓋了超類方法
  • 執(zhí)行特定切面邏輯如 @Entity, @Transactional

原理

  • 本質(zhì)是一個繼承了Annotation的特殊接口,特殊之處在于 定義時用 public @interface AnnotationName
    • @interface 會標(biāo)志該自定義接口 繼承 java.lang.Annotation 接口
  • 再簡化上面這句話水慨,即注解是一種接口,而且是特殊接口
  • 既然是接口, 那實際運行時就會是其實現(xiàn)類敬扛,而且該實現(xiàn)類我們未定義
  • 注解的實現(xiàn)類是 Java runtime 生成的動態(tài)代理對象$Proxy1晰洒,
  • 而且,通過掃描所有類舔哪,反射判斷其是否有annotation欢顷,然后創(chuàng)建代理
  • 且代理是JDK 面向接口的代理
  • 通過代理對象Proxy instance 調(diào)用 自定義注解(接口)中的方法,最終調(diào)用AnnotationInvocationHandler的invoke方法

元注解

  • java.lang.annotation提供4種元注解捉蚤,注解自定義注解
    • @Documented- 注解是否包含在JavaDoc中抬驴??
    • @Retention- 在哪個階段起作用缆巧,結(jié)束這個階段就可以丟棄了布持,標(biāo)志注解的生命周期
      • RetentionPolicy.SOURCE, 編譯期間起作用,編譯結(jié)束后不再有任何意義陕悬,編譯后丟掉不會寫入字節(jié)碼
        • @Override, @SuppressWarnings
      • RetentionPolicy.CLASS, 在類加載時候起作用题暖,在字節(jié)碼中存在且被需要,類加載結(jié)束則被丟棄,運行時獲取不到該注解注解默認(rèn)聲明周期
      • Retention.RUNTIME, 始終不丟棄胧卤,運行前保留
        • 反射機(jī)制終于可以起到作用了唯绍,可以讀取該注解
        • 我們自定義注解一般使用這種方式
    • @Target- 注解用于什么地方
      • ElementType.Type, 用于接口(包括注解類型)、類枝誊、enum
        • 如 @Entity况芒,@Controller, @Target
      • ElementType.METHOD,
        • 如 @Override
      • ElementType.PARAMETER, 方法參數(shù)
        • 如 @RequestParam, @RequestBody
    • @Inherited- 類A被注解了,且該注解標(biāo)明了@Inherited 叶撒,那A的子類會同樣被注解绝骚,繼承性

注解分類

  • 標(biāo)記類注解,如@Override祠够,@Deprecated, 聯(lián)想 標(biāo)記接口井辆,如Serializable挪圾,Cloneable
  • 非標(biāo)記接口

自定義注解的規(guī)則

  • 類型定義 @interface,且 不能 再去繼承其他接口
  • 參數(shù)成員只能用 public 聯(lián)想,注解本質(zhì)就是一個接口
  • 參數(shù)成員只能是 8 大基本類型和String包雀、Enum迟几、Class诗良、Annotation及 這些類型的數(shù)組
  • 要獲取類台猴、方法、字段的注解信息叽奥,必須通過反射
  • 注解也可以沒有定義成員扔水,如標(biāo)記類注解

總結(jié)

  • 注解就是一種標(biāo)志、判斷作用朝氓,
  • 與@Override 類標(biāo)記注解不同魔市,Retention.RUNTIME 類注解是在 運行時起 標(biāo)記作用,從而對其標(biāo)志的對象(類赵哲、變量待德、方法等)來添加邏輯
  • 為了更好的規(guī)定如何對標(biāo)志對象增強(qiáng)邏輯,在自定義注解類中添加變量進(jìn)一步作為判斷
  • 聯(lián)想 @RequestMapping(method=GET), @Transactional(isolation=true) 等
  • 即枫夺,運行時標(biāo)記
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末将宪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橡庞,更是在濱河造成了極大的恐慌较坛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒最,死亡現(xiàn)場離奇詭異丑勤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吧趣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門法竞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耙厚,“玉大人,你說我怎么就攤上這事岔霸⊙” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵秉剑,是天一觀的道長泛豪。 經(jīng)常有香客問我,道長侦鹏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任臀叙,我火速辦了婚禮略水,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劝萤。我一直安慰自己渊涝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布床嫌。 她就那樣靜靜地躺著跨释,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厌处。 梳的紋絲不亂的頭發(fā)上鳖谈,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音阔涉,去河邊找鬼缆娃。 笑死,一個胖子當(dāng)著我的面吹牛瑰排,可吹牛的內(nèi)容都是我干的贯要。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼椭住,長吁一口氣:“原來是場噩夢啊……” “哼崇渗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起京郑,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤宅广,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傻挂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乘碑,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年金拒,在試婚紗的時候發(fā)現(xiàn)自己被綠了兽肤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片套腹。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖资铡,靈堂內(nèi)的尸體忽然破棺而出电禀,到底是詐尸還是另有隱情,我是刑警寧澤笤休,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布尖飞,位于F島的核電站,受9級特大地震影響店雅,放射性物質(zhì)發(fā)生泄漏政基。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一闹啦、第九天 我趴在偏房一處隱蔽的房頂上張望沮明。 院中可真熱鬧,春花似錦窍奋、人聲如沸荐健。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽江场。三九已至,卻和暖如春窖逗,著一層夾襖步出監(jiān)牢的瞬間址否,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工滑负, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留在张,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓矮慕,卻偏偏與公主長得像帮匾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痴鳄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 深入理解Java:注解(Annotation)自定義注解入門 要深入學(xué)習(xí)注解瘟斜,我們就必須能定義自己的注解,并使用注...
    _npc_閱讀 544評論 0 0
  • 在很多框架中都使用了自定義注解痪寻,之前在項目中也用到了自定義注解來對代碼做一些解耦螺句,今天就給大家介紹下自定義注解的使...
    monkey01閱讀 5,893評論 1 8
  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,158評論 15 116
  • 一 簡介注解是Java 1.5引入的,可以提供代碼的額外信息橡类,目前正在被廣泛應(yīng)用蛇尚。除了Java內(nèi)置注解,我們也可以...
    Diffey閱讀 9,786評論 1 11
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,161評論 0 2