說說 Java 注解

Java 注解可以看做是 Javadoc 和 Xdoclet 標(biāo)簽的延伸和發(fā)展太闺,我們可以自定義注解標(biāo)簽蝴蜓,并通過 Java 語(yǔ)言的反射機(jī)制來(lái)獲取類中標(biāo)注的注解,完成特定的功能 。

注解是代碼的附屬信息咏尝,無(wú)論增加還是刪除注解,都不會(huì)影響程序代碼的運(yùn)行啸罢。因?yàn)?Java 語(yǔ)言解釋器會(huì)忽略這些注解编检,而讓第三方工具負(fù)責(zé)對(duì)注解進(jìn)行處理 。 第三方工具可以利用代碼中的注解間接控制程序代碼的運(yùn)行扰才,它們通過 Java 反射機(jī)制讀取注解的信息允懂,并根據(jù)這些信息更改邏輯 。

1 定義

我們使用 @interface 來(lái)定義注解類衩匣。

示例:

@Retention(RetentionPolicy.RUNTIME)//保留期限
@Target(ElementType.METHOD)//目標(biāo)類型
public @interface Log {
    boolean value() default true;//聲明成員變量
}

示例中的 @Retention@Target 被稱為元注解(Meta-annotation)蕾总。

1.1 成員變量

可以在注解類中定義多個(gè)成員變量,成員變量的定義語(yǔ)法有以下這些要求:

  • 不能定義入?yún)ⅰ?/li>
  • 不能拋出異常琅捏。
  • 可以通過 default 定義一個(gè)默認(rèn)值生百。
  • 合法的成員類型有這些 - 原始類型及其封裝類、Class柄延、enums蚀浆、注解類型和包含上述類型的數(shù)組類型。
  • 如果注解類只有一個(gè)成員變量搜吧,那么必須名為 value()市俊。在使用時(shí)可以忽略成員名稱和賦值符號(hào)(=),比如可以這樣使用示例中的注解 @Log(true)滤奈。
  • 如果注解類擁有多個(gè)成員變量摆昧,如果僅對(duì) value 進(jìn)行賦值,則也可以忽略成員名稱和賦值符號(hào)(=)蜒程。
  • 如果注解類擁有多個(gè)成員變量绅你,又需要同時(shí)對(duì)多個(gè)成員變量進(jìn)行賦值,那么就必須使用成員名稱加賦值號(hào)表示搞糕,比如事務(wù)注解:@Transactional(propagation= Propagation.MANDATORY,isolation= Isolation.DEFAULT)勇吊。
  • 注解類可以沒有成員變量,這樣注解類被稱為標(biāo)注注解窍仰,由調(diào)用程序負(fù)責(zé)判斷處理汉规。
  • 注解類不能繼承其它類,也不能實(shí)現(xiàn)其它接口。

1.2 保留期限 @Retention

@Retention 表示保留期限针史,它被定義在 java.lang.annotation.RetentionPolicy 中:

保留期限類型 說明
SOURCE 注解信息僅保留在源代碼文件中晶伦。
CLASS 注解信息保留在源代碼文件與字節(jié)碼文件中。
RUNTIME 注解信息不僅保留在源代碼文件與字節(jié)碼文件中啄枕,而且會(huì)被加載到 JVM 中婚陪,在運(yùn)行期可以通過反射讀取這些注解信息。

1.3 目標(biāo)類型 @Target

@Target 表示注解的應(yīng)用目標(biāo)類型频祝。它被定義在 java.lang.annotation.ElementType 中泌参。

目標(biāo)類型 說明
TYPE 類、接口常空、注解類型沽一、Enum 處聲明。
FIELD 成員變量漓糙、Enum 常量處聲明铣缠。
METHOD 方法處聲明。
PARAMETER 參數(shù)處聲明昆禽。
CONSTRUCTOR 構(gòu)造函數(shù)處聲明蝗蛙。
LOCAL_VARIABLE 局部變量處聲明。
ANNOTATION_TYPE 注解類處聲明醉鳖。
PACKAGE 包處聲明捡硅。
TYPE_PARAMETER 類型參數(shù)處聲明。(1.8 新增)
TYPE_USE 使用類型處聲明辐棒。(1.8 新增)

2 配置注解

public class User {

    @Log()
    public void rent(String userId) {
        System.out.println("User:租賃【充電寶】");
    }

    @Log(false)
    public void back(String userId){
        System.out.println("User:歸還【充電寶】");
    }
}

這里直接在需要的方法上病曾,加入注解類。

標(biāo)注注解的格式為:

@<注解名>(<成員名1>=<成員值1>,<成員名2>=<成員值2>,...)

如果成員變量是數(shù)組類型漾根,就可以通過{} 進(jìn)行賦值。

說明 示例
單成員注解 @Service("userService")
多成員注解 @Transactional(propagation= Propagation.MANDATORY,isolation= Isolation.DEFAULT)
無(wú)成員注解 @Override
成員類型為普通數(shù)組 @SuppressWarnings(value={"unchecked", "rawtypes"})
成員類型為注解數(shù)組 @ComponentScans({@ComponentScan("1.xml"),@ComponentScan("2.xml")})

3 獲取注解

對(duì)于保留期限為 RetentionPolicy.RUNTIME 的注解鲫竞,可以通過反射來(lái)獲取注解信息 辐怕。

在 Java5.0 中, Package从绘、Class寄疏、Constructor、Method 以及 Field 等反射對(duì)象都新增了訪問注解的多種方法僵井,它們都支持泛型陕截。

Class clazz = User.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
    //獲取注解
    Log log = method.getAnnotation(Log.class);
    if (log != null) {
        if (log.value()) {
            System.out.println(method.getName() + "() 方法需要記錄日志");
        } else {
            System.out.println(method.getName() + "() 方法不需要記錄日志");
        }
    }
}

輸出結(jié)果:

back() 方法不需要記錄日志
rent() 方法需要記錄日志

是不是很簡(jiǎn)單呀 O(∩_∩)O哈哈~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市批什,隨后出現(xiàn)的幾起案子农曲,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乳规,死亡現(xiàn)場(chǎng)離奇詭異形葬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暮的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門笙以,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冻辩,你說我怎么就攤上這事猖腕。” “怎么了恨闪?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵谈息,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我凛剥,道長(zhǎng)侠仇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任犁珠,我火速辦了婚禮逻炊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犁享。我一直安慰自己余素,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布炊昆。 她就那樣靜靜地躺著桨吊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凤巨。 梳的紋絲不亂的頭發(fā)上视乐,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音敢茁,去河邊找鬼佑淀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛彰檬,可吹牛的內(nèi)容都是我干的伸刃。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼逢倍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捧颅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起较雕,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碉哑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭梗,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忘晤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了激捏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片设塔。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖远舅,靈堂內(nèi)的尸體忽然破棺而出闰蛔,到底是詐尸還是另有隱情,我是刑警寧澤图柏,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布序六,位于F島的核電站,受9級(jí)特大地震影響蚤吹,放射性物質(zhì)發(fā)生泄漏例诀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一裁着、第九天 我趴在偏房一處隱蔽的房頂上張望繁涂。 院中可真熱鬧,春花似錦二驰、人聲如沸扔罪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矿酵。三九已至,卻和暖如春矗积,著一層夾襖步出監(jiān)牢的瞬間全肮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工漠魏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倔矾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓柱锹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丰包。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禁熏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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