Java注解

定義

注解(Annotation),也叫元數(shù)據(jù)互纯,是一種代碼級別的說明。它是JDK1.5及以后版本引入的一個特性磕蒲,與類留潦、接口、枚舉是在同一層次辣往。它可以聲明在包兔院、類、字段站削、方法坊萝、局部變量、方法參數(shù)许起、構(gòu)造函數(shù)等的前面十偶,用來對這些元素進(jìn)行說明和注釋。

元注解

元注解的作用就是負(fù)責(zé)注解其他注解园细,即注解的注解惦积。Java5.0定義了4個標(biāo)準(zhǔn)的meta-annotation類型,它們被用來提供對其他annotatio類型作說明猛频。Java5.0定義的元注解:@Retention狮崩、@Target蛛勉、@Documented@Inherited

@Retention

@Retention表示需要在什么級別保存該注釋信息睦柴,用于描述注解的生命周期诽凌,取值有

? ? ? ? ? ? ?1、@Retention(RetentionPolicy.SOURCE)? 注解僅存在于源碼中坦敌,在class字節(jié)碼文件中不包含

? ? ? ? ? ? ?2侣诵、@Retention(RetentionPolicy.CLASS) ?默認(rèn)的保留策略,注解會在class字節(jié)碼文件中存在恬试,但運(yùn)行時無法獲得

? ? ? ? ? ? ?3窝趣、@Retention(RetentionPolicy.RUNTIME) 注解會在class字節(jié)碼文件中存在,在運(yùn)行時可以通過反射獲取到


SOURCE 例1

自定義注解MyAnnotation,Retention的取值是保留策略的SOURCE

@Retention(RetentionPolicy.SOURCE)

public ?@interface ?MyAnnotation{

}

標(biāo)注的類Test

@MyAnnotation

public classTest {

? ? ? ? ? ?public static void main(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?System.out.println("生成的class文件反編譯后不會出現(xiàn)注解@MyAnnotation");

? ? ? ? ? ? }

}

反編譯生成的.class文件训柴,Test類不存在MyAnnotation注解

CLASS 例2

自定義注解MyAnnotation,Retention的取值是保留策略的CLASS

@Retention(RetentionPolicy.CLASS)

public ?@interface ?MyAnnotation{

}

標(biāo)注的類Test

@MyAnnotation

public classTest {

? ? ? ? ? ? ? ?public static void ?main(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("生成的class文件反編譯后會出現(xiàn)注解@MyAnnotation");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Annotation[] annotations = Test.class.getAnnotations();

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?System.out.println("Runtime期間標(biāo)注在Test類上的注解個數(shù)為:"+ annotations.length);

? ? ? ? ? ? ? ? ?}

}

驗證結(jié)果:.class文件出現(xiàn)注解哑舒,運(yùn)行期間獲取Test類上的注解個數(shù)為0



RUNTIME 例2

自定義注解MyAnnotation,Retention的取值是保留策略的RUNTIME

@Retention(RetentionPolicy.RUNTIME)

public? @interface? MyAnnotation{

}

標(biāo)注的類Test

@MyAnnotation

public classTest {

? ? ? ? ? ? ?public static void ?main(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("生成的class文件反編譯后會出現(xiàn)注解@MyAnnotation");

? ? ? ? ? ? ? ? ? ? ? ? ? ? Annotation[] annotations = Test.class.getAnnotations();

? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("Runtime期間標(biāo)注在Test類上的注解個數(shù)為:"+ annotations.length);

? ? ? ? ? ? ? }

}

驗證結(jié)果:.class文件出現(xiàn)注解,運(yùn)行期間獲取Test類上的注解個數(shù)為1



@Target

用于設(shè)定注解使用范圍幻馁,通過ElementType來指定可使用范圍的枚舉集合洗鸵。

注解只能在ElementType設(shè)定的范圍內(nèi)使用,否則將會編譯報錯仗嗦。

@Documented

@Documented標(biāo)注的注解應(yīng)該被javadoc工具記錄膘滨。默認(rèn)情況下,javadoc是不包括注解的稀拐,如果聲明注解時指定了@Documented,注解類型信息也會被包括在生成的文檔中火邓。

@Inheried

@Inherited:允許子類繼承標(biāo)注在父類上的注解。

package-info.java

package-info.java不是平常類德撬,其作用有三個:

? ? ? ? ? 1.為標(biāo)注在包上Annotation提供便利

? ? ? ? ? ?2.聲明包的私有類和常量

? ? ? ? ? ?3. 提供包的整體注釋聲明

package-info.java里不能聲明public classpublic interface铲咨,在package-info.java定義的類和普通類沒什么卻別。


例子 1

MyPackageAnnotation

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PACKAGE)

@Documented

public@interfaceMyPackageAnnotation{

? ? ? ? ? String version()default"";

}

package-info.java

@MyPackageAnnotation(version ="1.0")

packagecom.leeem.domain;

importcom.leeem.annotation.MyPackageAnnotation;

//類方法

classPackageClass{

? ? ? ? ? ?public voidclassMethod(){

? ? ? ? ? ? ? ? ? ? ? ? System.out.println("class method");

? ? ? ? ? ?}

}

//類常量字段

classPackageClassConstant{

? ? ? ? ? ? ? public static finalStringERROR_CODE="100001";

}

//接口方法

interfacePackageInterface{

? ? ? ? ? public voidinterfaceMethod();

}

Test.java ?--獲取包注解

public classTest {

? ? ? ? ? ? ? ? ? ? ?public static voidmain(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Package p = Package.getPackage("com.leeem.domain");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MyPackageAnnotationmyPackageAnnotation = p.getAnnotation(MyPackageAnnotation.class);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(myPackageAnnotation !=null&& p.isAnnotationPresent(MyPackageAnnotation.class)){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("獲取到包注解蜓洪,且版本version為:"+ myPackageAnnotation.version());

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? }

}

輸出:獲取到包注解纤勒,且版本version為:1.0

Test.java ?--使用package-info.java定義的類 (接口類似)

public classTest {

? ? ? ? ? ? ? ? public static voidmain(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PackageClasspackageClass =newPackageClass();

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? packageClass.classMethod();

? ? ? ? ? ? ? ? ? }

}

輸出:class method

Test.java? --使用package-info.java定義的類的常量

public classTest {

? ? ? ? ? ? ? ?public static voidmain(String[] args) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?System.out.println(PackageClassConstant.ERROR_CODE);

? ? ? ? ? ? ? ?}

}

輸出:100001


Java內(nèi)置注解

Java SE5內(nèi)置了三種標(biāo)準(zhǔn)注解:@Override、@Deprecated隆檀、@SuppressWarnings

@Override:表示當(dāng)前的方法定義將覆蓋超類中的方法摇天。

@Deprecated:標(biāo)注已過時或已廢棄的代碼,通常存在更好的選擇恐仑。使用該注解標(biāo)注的元素時泉坐,編譯器會報警

@SuppressWarnings:用來抑制編譯時的警告信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菊霜,隨后出現(xiàn)的幾起案子坚冀,更是在濱河造成了極大的恐慌,老刑警劉巖鉴逞,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件记某,死亡現(xiàn)場離奇詭異司训,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)液南,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門壳猜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滑凉,你說我怎么就攤上這事统扳。” “怎么了畅姊?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵咒钟,是天一觀的道長。 經(jīng)常有香客問我若未,道長朱嘴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任粗合,我火速辦了婚禮萍嬉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隙疚。我一直安慰自己壤追,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布供屉。 她就那樣靜靜地躺著行冰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伶丐。 梳的紋絲不亂的頭發(fā)上资柔,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音撵割,去河邊找鬼。 笑死辙芍,一個胖子當(dāng)著我的面吹牛啡彬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播故硅,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼庶灿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吃衅?” 一聲冷哼從身側(cè)響起往踢,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徘层,沒想到半個月后峻呕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體利职,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年瘦癌,在試婚紗的時候發(fā)現(xiàn)自己被綠了猪贪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡讯私,死狀恐怖热押,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斤寇,我是刑警寧澤桶癣,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站娘锁,受9級特大地震影響牙寞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜致盟,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一碎税、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馏锡,春花似錦雷蹂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至党巾,卻和暖如春萎庭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齿拂。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工驳规, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人署海。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓吗购,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砸狞。 傳聞我的和親對象是個殘疾皇子捻勉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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