Java基礎(chǔ)-高級(jí)特性-注解

Java工程師知識(shí)樹 / Java基礎(chǔ)


注解介紹

Java 注解(Annotation)又稱 Java 標(biāo)注玩焰,是 JDK5.0 引入的一種注釋機(jī)制

Java 語(yǔ)言中的類裤唠、方法砂客、變量泥张、參數(shù)和包等都可以被注解。

在編譯器生成類文件時(shí)鞠值,注解可以被嵌入到字節(jié)碼中媚创。Java 虛擬機(jī)可以保留注解內(nèi)容,在運(yùn)行時(shí)可以獲取到注解內(nèi)容 彤恶。

Java 注解支持自定義 Java 注解钞钙。

注解(Annotation)與注釋(Comments)是有區(qū)別的鳄橘。注解(Annotation)與注釋(Comments)不同在于Java注解可以通過(guò)反射獲取注解內(nèi)容

注解語(yǔ)法

注解通過(guò) @interface 關(guān)鍵字進(jìn)行定義:

public @interface MyAnnotation {
}

注解分類

注解可以分為內(nèi)置注解芒炼、元注解瘫怜、自定義注解

內(nèi)置注解
  • @Override - 檢查該方法是否是重寫方法。如果發(fā)現(xiàn)其父類本刽,或者是引用的接口中并沒(méi)有該方法時(shí)鲸湃,會(huì)報(bào)編譯錯(cuò)誤。
  • @Deprecated - 標(biāo)記過(guò)時(shí)方法子寓。如果使用該方法唤锉,會(huì)報(bào)編譯警告。不推薦使用别瞭,可以使用或者有更好的方式窿祥。
  • @SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。
  • @SafeVarargs - Java 7 開(kāi)始支持蝙寨,忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告晒衩。
  • @FunctionalInterface - Java 8 開(kāi)始支持,標(biāo)識(shí)一個(gè)匿名函數(shù)或函數(shù)式接口墙歪。
  • @Repeatable - Java 8 開(kāi)始支持听系,標(biāo)識(shí)某注解可以在同一個(gè)聲明上使用多次。
元注解
  • @Retention - 標(biāo)識(shí)這個(gè)注解怎么保存虹菲,是只在代碼中靠胜,還是編入class文件中,或者是在運(yùn)行時(shí)可以通過(guò)反射訪問(wèn)毕源±四控制注解的作用時(shí)間范圍。
  • @Documented - 標(biāo)記這些注解是否包含在用戶文檔中霎褐。
  • @Target - 標(biāo)記這個(gè)注解應(yīng)該是哪種 Java 成員址愿。控制注解的作用區(qū)域范圍冻璃。
  • @Inherited - 標(biāo)記這個(gè)注解是繼承于哪個(gè)注解類(默認(rèn) 注解并沒(méi)有繼承于任何子類)

@Retention屬性介紹

@Retention(RetentionPolicy.SOURCE) 只在編譯時(shí)有效
@Retention(RetentionPolicy.CLASS) 會(huì)寫到class字節(jié)碼文件里响谓,不可以通過(guò)反射讀取
@Retention(RetentionPolicy.RUNTIME), 注解會(huì)在class字節(jié)碼文件中存在省艳,在運(yùn)行時(shí)可以通過(guò)反射獲取到娘纷。一般自定義注解都是使用該元注解

@Target屬性介紹

@Target(ElementType.TYPE) 作用接口、類跋炕、枚舉赖晶、注解
@Target(ElementType.FIELD) 作用屬性字段、枚舉的常量
@Target(ElementType.METHOD) 作用方法
@Target(ElementType.PARAMETER) 作用方法參數(shù)
@Target(ElementType.CONSTRUCTOR) 作用構(gòu)造函數(shù)
@Target(ElementType.LOCAL_VARIABLE)作用局部變量
@Target(ElementType.ANNOTATION_TYPE)作用于注解
@Target(ElementType.PACKAGE) 作用于包
@Target(ElementType.TYPE_PARAMETER) 作用于類型泛型枣购,即泛型方法嬉探、泛型類、泛型接口 (jdk1.8加入)
@Target(ElementType.TYPE_USE) 類型使用.可以用于標(biāo)注任意類型除了 class (jdk1.8加入)

自定義注解

使用@interface自定義注解時(shí)棉圈,自動(dòng)繼承了java.lang.annotation.Annotation接口涩堤。

  • @interface用來(lái)聲明一個(gè)注解,格式:public @interface 注解名稱{定義注解屬性}分瘾。
  • 注解的默認(rèn)屬性為 String value()胎围;只有一個(gè)value()屬性時(shí),可以忽略德召。
  • 注解內(nèi)的每個(gè)方法實(shí)際上都聲明了一個(gè)配置參數(shù)白魂,方法名稱為參數(shù)名稱,方法返回值為參數(shù)類型(返回值類型可以是1.基本數(shù)據(jù)類型;2.String;3.枚舉類型4.注解類型;5.Class類型;6.以上類型的一維數(shù)組類型
    eg:

  • 可以使用default來(lái)聲明參數(shù)的默認(rèn)值上岗。有默認(rèn)值的屬性福荸,使用注解時(shí)可以不將該屬性指定值。屬性沒(méi)有默認(rèn)值時(shí)肴掷,使用注解時(shí)必須賦值敬锐。

使用自定義注解實(shí)現(xiàn)記錄操作日志

基于注解的Aop日志記錄的實(shí)現(xiàn)方案:

  1. 自定義日志注解。
  2. 定義切面呆瞻。
  3. 切面方法中通過(guò)Java反射機(jī)制獲取注解內(nèi)的屬性值台夺。
  4. 在操作方法(增刪改重要表)時(shí),添加注解痴脾,eg:@OperationLog(operationType = "1", operationDesc = "后臺(tái)管理系統(tǒng)添加用戶", operator = "admin", moduleId = "User")

自定義日志注解類

package com.hmio.study.annotion;

import java.lang.annotation.*;

@Target({ ElementType.PARAMETER, ElementType.METHOD })//作用方法颤介、作用方法參數(shù)
@Retention(RetentionPolicy.RUNTIME)//運(yùn)行時(shí)有效
@Documented//標(biāo)注注解在生成javadoc時(shí)是否顯示
public @interface OperationLog {
    /** 要執(zhí)行的操作類型比如:增刪改導(dǎo)入導(dǎo)出等操作 可以使用枚舉類型**/
    public String operationType();// 沒(méi)有默認(rèn)值,在使用時(shí)必須賦值

    /** 要執(zhí)行的具體操作比如:操作具體描述 **/
    public String operationDesc();// 沒(méi)有默認(rèn)值赞赖,在使用時(shí)必須賦值

    /** 操作人:操作的操作人 任務(wù)操作可能沒(méi)有操作人**/
    public String operator() default "";// 有默認(rèn)值滚朵,在使用時(shí)可以不賦值

    /** 操作類型所屬模塊 僅用于特定場(chǎng)景日志采集使用,非要求請(qǐng)使用默認(rèn)值 可以使用枚舉類型     */
    public String moduleId() default "";// 有默認(rèn)值,在使用時(shí)可以不賦值

}

使用示例:

@OperationLog (operationType = "IMPORT", 
      operationDesc = "用戶信息導(dǎo)入" ,
      moduleId = "1")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末前域,一起剝皮案震驚了整個(gè)濱河市始绍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌话侄,老刑警劉巖亏推,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異年堆,居然都是意外死亡吞杭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門变丧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芽狗,“玉大人,你說(shuō)我怎么就攤上這事痒蓬⊥妫” “怎么了滴劲?”我有些...
    開(kāi)封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)顾复。 經(jīng)常有香客問(wèn)我班挖,道長(zhǎng),這世上最難降的妖魔是什么芯砸? 我笑而不...
    開(kāi)封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任萧芙,我火速辦了婚禮,結(jié)果婚禮上假丧,老公的妹妹穿的比我還像新娘双揪。我一直安慰自己,他們只是感情好包帚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布渔期。 她就那樣靜靜地躺著,像睡著了一般渴邦。 火紅的嫁衣襯著肌膚如雪擎场。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天几莽,我揣著相機(jī)與錄音迅办,去河邊找鬼。 笑死章蚣,一個(gè)胖子當(dāng)著我的面吹牛站欺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纤垂,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼矾策,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了峭沦?” 一聲冷哼從身側(cè)響起贾虽,我...
    開(kāi)封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吼鱼,沒(méi)想到半個(gè)月后蓬豁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菇肃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年地粪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琐谤。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟆技,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情质礼,我是刑警寧澤旺聚,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站眶蕉,受9級(jí)特大地震影響砰粹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妻坝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惊窖。 院中可真熱鬧刽宪,春花似錦、人聲如沸界酒。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁欣。三九已至庇谆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凭疮,已是汗流浹背饭耳。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留执解,地道東北人寞肖。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衰腌,于是被迫代替她去往敵國(guó)和親新蟆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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