Java注解

一、什么是java注解

注解套腹,顧名思義绪抛,注解,就是對(duì)某一事物進(jìn)行添加注釋說(shuō)明,會(huì)存放一些信息电禀,這些信息可能對(duì)以后某個(gè)時(shí)段來(lái)說(shuō)是很有用處的。

Java注解又叫Java標(biāo)注笤休,java提供了一套機(jī)制尖飞,使得我們可以對(duì)方法、類、參數(shù)政基、包贞铣、域以及變量等添加標(biāo)準(zhǔn)(即附上某些信息)。且在以后某個(gè)時(shí)段通過(guò)反射將標(biāo)注的信息提取出來(lái)以供使用沮明。

二辕坝、自定義Java標(biāo)注

1 為什么要自定義注解

Java從1.5版本以后默認(rèn)內(nèi)置三個(gè)標(biāo)注:

  • @Override:只能用在方法之上的,用來(lái)告訴別人這一個(gè)方法是改寫父類的荐健。

  • @Deprecated:建議別人不要使用舊的API的時(shí)候用的,編譯的時(shí)候會(huì)用產(chǎn)生警告信息,可以設(shè)定在程序里的所有的元素上.

  • @SuppressWarnings:這一個(gè)類型可以來(lái)暫時(shí)把一些警告信息消息關(guān)閉.

但是酱畅,僅僅這三個(gè)標(biāo)注是不能滿足我們開(kāi)發(fā)時(shí)一些需求的。所以java允許我們自定義注解來(lái)使用江场。

2 如何自定義注解

自定義步驟大致分為兩步:

1 > 通過(guò)@interface關(guān)鍵字(注意纺酸,不是interface,是@interace)聲明注解名稱址否,以及注解的成員屬性或者叫做注解的參數(shù)餐蔬。

2 >使用Java內(nèi)置的四個(gè)元注解對(duì)這個(gè)自定義標(biāo)注的功能和范圍進(jìn)行一些限制

問(wèn)題來(lái)了,什么是元注解佑附?

3 >什么是元注解

元注解樊诺,就是定義注解的注解,也就是說(shuō)這些元注解是的作用就是專門用來(lái)約束其它注解的注解音同。請(qǐng)區(qū)別上面那三個(gè)注解词爬,他們也是通過(guò)元注解定義而來(lái)的。

元注解有哪些呢瘟斜,主要有四個(gè)@Target,@Retention,@Documented,@Inherited缸夹?

1.  * 元注解有:@Target,@Retention,@Documented,@Inherited

2.  * @Target 表示該注解用于什么地方,可能的 ElemenetType 參數(shù)包括:

3.  * ElemenetType.CONSTRUCTOR 構(gòu)造器聲明

4.  * ElemenetType.FIELD 域聲明(包括 enum 實(shí)例)

5.  * ElemenetType.LOCAL_VARIABLE 局部變量聲明

6.  * ElemenetType.METHOD 方法聲明

7.  * ElemenetType.PACKAGE 包聲明

8.  * ElemenetType.PARAMETER 參數(shù)聲明

9. * ElemenetType.TYPE 類螺句,接口(包括注解類型)或enum聲明

10. * @Retention 表示在什么級(jí)別保存該注解信息虽惭。可選的 RetentionPolicy 參數(shù)包括:

11. * RetentionPolicy.SOURCE 注解將被編譯器丟棄

12. * RetentionPolicy.CLASS 注解在class文件中可用蛇尚,但會(huì)被VM丟棄

13. * RetentionPolicy.RUNTIME VM將在運(yùn)行期也保留注釋芽唇,因此可以通過(guò)反射機(jī)制讀取注解的信息。

14. * @Documented 將此注解包含在 javadoc 中

15. * @Inherited 允許子類繼承父類中的注解

4 自定義及使用注解示例

自定義一個(gè)類級(jí)別的標(biāo)注Description

package lighter.javaeye.com;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


@Target(ElementType.TYPE)//這個(gè)標(biāo)注應(yīng)用于類

@Retention(RetentionPolicy.RUNTIME)//標(biāo)注會(huì)一直保留到運(yùn)行時(shí)

@Documented//將此注解包含在javadoc中

public @interface Description {

    String value();

}

再定義個(gè)方法級(jí)別的注解Name

package lighter.javaeye.com;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


//注意這里的@Target與@Description里的不同,參數(shù)成員也不同

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Name {

String originate();

String community();

}

然后使用以上兩個(gè)注解

package lighter.javaeye.com;


@Description(value = "javaeye,做最棒的軟件開(kāi)發(fā)交流社區(qū)")

public class JavaEyer {

    @Name(originate = "創(chuàng)始人:robbin", community = "javaEye")

    public String getName()

    {

        return null;

    }


    @Name(originate = "創(chuàng)始人:江南白衣", community = "springside")

    public String getName2()

    {

        return "借用兩位的id一用,寫這一個(gè)例子,請(qǐng)見(jiàn)諒!";

    }

}

說(shuō)明:其中標(biāo)注“@Description(value="javaeye,做最棒的軟件開(kāi)發(fā)交流社區(qū)")”取劫,可以寫成“@Description("javaeye,做最棒的軟件開(kāi)發(fā)交流社區(qū)") ”匆笤,結(jié)果也是一樣的。因?yàn)镈escription標(biāo)注定義的時(shí)候其參數(shù)(或者說(shuō)屬性)為value谱邪。而value比較特殊炮捧,它在被指定參數(shù)的時(shí)候可以不用顯示的寫出來(lái)。當(dāng)然如果定義的時(shí)候參數(shù)名不是value而是其它的比如des惦银,那么使用注解的時(shí)候咆课,必須顯示寫出參數(shù)名末誓,然后再賦值:@Description(Des=”xxx”)

提取出注解的信息

package lighter.javaeye.com;


import java.lang.reflect.Method;

import java.util.HashSet;

import java.util.Set;


public class TestAnnotation {

    /**
     * author lighter
     * <p>
     * 說(shuō)明:具體關(guān)天Annotation的API的用法請(qǐng)參見(jiàn)javaDoc文檔
     */

    public static void main(String[] args) throws Exception {

        String CLASS_NAME = "lighter.javaeye.com.JavaEyer";

        Class test = Class.forName(CLASS_NAME);

        Method[] method = test.getMethods();

        boolean flag = test.isAnnotationPresent(Description.class);

        if (flag)

        {

            Description des = (Description) test.getAnnotation(Description.class);

            System.out.println("描述:" + des.value());

            System.out.println("-----------------");

        }


//把JavaEyer這一類有利用到@Name的全部方法保存到Set中去

        Set set = new HashSet();

        for (int i = 0; i

        {

            boolean otherFlag = method[i].isAnnotationPresent(Name.class);

            if (otherFlag) set.add(method[i]);

        }

        for (Method m : set)

        {

            Name name = m.getAnnotation(Name.class);

            System.out.println(name.originate());

            System.out.println("創(chuàng)建的社區(qū):" + name.community());

        }

    }

}

注意事項(xiàng):

所有的Annotation會(huì)自動(dòng)繼承java.lang.annotation這一個(gè)接口,所以不能再去繼承別的類或是接口.

最重要的一點(diǎn),Annotation類型里面的參數(shù)該怎么設(shè)定:

  • 第一,只能用public或默認(rèn)(default)這兩個(gè)訪問(wèn)權(quán)修飾.例如,String value();這里把方法設(shè)為defaul默認(rèn)類型.

  • 第二,參數(shù)成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組.例如,String value();這里的參數(shù)成員就為String.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市书蚪,隨后出現(xiàn)的幾起案子喇澡,更是在濱河造成了極大的恐慌,老刑警劉巖殊校,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴玖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡为流,警方通過(guò)查閱死者的電腦和手機(jī)呕屎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)艺谆,“玉大人榨惰,你說(shuō)我怎么就攤上這事【蔡溃” “怎么了琅催?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虫给。 經(jīng)常有香客問(wèn)我藤抡,道長(zhǎng),這世上最難降的妖魔是什么抹估? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任缠黍,我火速辦了婚禮,結(jié)果婚禮上药蜻,老公的妹妹穿的比我還像新娘瓷式。我一直安慰自己,他們只是感情好语泽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布贸典。 她就那樣靜靜地躺著,像睡著了一般踱卵。 火紅的嫁衣襯著肌膚如雪廊驼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天惋砂,我揣著相機(jī)與錄音妒挎,去河邊找鬼。 笑死西饵,一個(gè)胖子當(dāng)著我的面吹牛酝掩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眷柔,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庸队,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼积蜻!你這毒婦竟也來(lái)了闯割?” 一聲冷哼從身側(cè)響起彻消,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宙拉,沒(méi)想到半個(gè)月后宾尚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谢澈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年煌贴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锥忿。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牛郑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敬鬓,到底是詐尸還是另有隱情淹朋,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布钉答,位于F島的核電站础芍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏数尿。R本人自食惡果不足惜仑性,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望右蹦。 院中可真熱鬧诊杆,春花似錦、人聲如沸何陆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甲献。三九已至宰缤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晃洒,已是汗流浹背慨灭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留球及,地道東北人氧骤。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吃引,于是被迫代替她去往敵國(guó)和親筹陵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刽锤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 一、概念 ??Annotation(注解)就是Java提供了一種源程序中的元素關(guān)聯(lián)任何信息和任何元數(shù)據(jù)(metad...
    從菜鳥(niǎo)到老菜鳥(niǎo)閱讀 2,107評(píng)論 0 2
  • 內(nèi)容概要 Annotation的概念 Annotation的作用 Annotation的分類 系統(tǒng)內(nèi)置注解 元注解...
    DevinZhang閱讀 4,164評(píng)論 0 28
  • 深入理解 Java 注解 本文內(nèi)容基于 JDK8朦佩。注解是 JDK5 引入的并思,后續(xù) JDK 版本擴(kuò)展了一些內(nèi)容,本文...
    靜默虛空閱讀 467評(píng)論 0 0
  • 什么是注解 注解對(duì)于開(kāi)發(fā)人員來(lái)講既熟悉又陌生语稠,熟悉是因?yàn)橹灰闶亲鲩_(kāi)發(fā)宋彼,都會(huì)用到注解(常見(jiàn)的@Override);...
    張明云閱讀 25,153評(píng)論 6 154
  • 今天周末﹋o﹋ 本來(lái)想的是早上做做飯仙畦,出門遛遛彎输涕,買點(diǎn)水果回來(lái),邊吃邊看看三國(guó)慨畸。下午打掃打掃衛(wèi)生莱坎,洗洗衣服,洗澡洗...
    五小夏閱讀 175評(píng)論 0 0