Java 注解(一):創(chuàng)建自定義注解

Java 注解

Java Annotations

什么是java注解


Java注解不屬于代碼的一部分,但用來給代碼添加元數(shù)據(jù)(metadata). Java注解并不會直接對其所注解的代碼運(yùn)行產(chǎn)生操作.

作用


編譯器說明

Java有三個(gè)內(nèi)建注解,分別是@Deprecated @Override 和 @SuppressWarnings. 他們可以給編譯器確認(rèn)指令.例如@override注解告訴編譯器被注解的方法被覆蓋.

編譯期指令:注解可以為編譯器提供編譯期指令.他們還可以被軟件構(gòu)建工具用于生成代碼,XML文件等

執(zhí)行期指令: 這種注解可以在代碼運(yùn)行期通過Java反射機(jī)制操作程序運(yùn)行.

注解基礎(chǔ)


注解以@開始,后面跟著注解的名字,字符@告訴編譯器這是一個(gè)注解.
例如

@Overrite

@表明這是一個(gè)注解,Overrite是這個(gè)注解的名字.

哪里可以使用注解

注解可以應(yīng)用于類,接口,方法和屬性.例如下面是為方法添加注解

@Override
void myAnnotationsMethod(){
    //Do someting here
}

Java內(nèi)建注解

Java有三個(gè)內(nèi)建注解:

  • @Override
  • @Deprecated
  • @SuppressWarnings
  1. @override注解
    @override注解被用于在子類中覆蓋父類的方法.這有助于增加代碼的可讀性,降低代碼維護(hù)難度.例如,當(dāng)改變父類方法的簽名后,子類中沒有做同步的函數(shù)簽名修改的情況下
    * 如果子類中的覆蓋方法使用了@override注解
    編譯器將拋出編譯錯(cuò)誤.以便開發(fā)人員及時(shí)方便的發(fā)現(xiàn)問題
    * 如果子類中的覆蓋方法沒有使用該注解
    編譯器在編譯時(shí)會認(rèn)為這個(gè)方法并不是覆蓋的父類方法而是子類新增的方法,從而編譯通過.而這并不是開發(fā)人員期望的結(jié)果.

例子

public class MyParentClass {

    public void justaMethod() {
        System.out.println("Parent class method");
    }
}


public class MyChildClass extends MyParentClass {

    @Override
    public void justaMethod() {
        System.out.println("Child class method");
    }
}
  1. @Deprecated注解
    表示被注解的元素不應(yīng)該再被使用.例如
@Deprecated
public void oneDeprecatedMethod(){
    //Do something here
}
  1. @SuppressWarnings
    該注解告訴編譯器忽略被注解元素編譯時(shí)產(chǎn)生的警告信息.例如,當(dāng)使用一個(gè)被@Deprecated注解的方法時(shí),希望編譯器忽略deprected警告,則可以使用如下的方式
@SuppressWarnings("depracation")
pulic void myNoWarningsMethod(){
    myObject.oneDeprecatedMethod();
}

創(chuàng)建自定義注解

示例:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(Element.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{
    int age() default 18;
    String name();
    String author() default "LeoSun";
    String[] friendList();
    public enum Sex{
        MALE,FEMALE
    }
    Sex sex() default Sex.MALE;
}
  • 注解創(chuàng)建時(shí)使用 @interface annotationName 其中annotationName為自定義注解的名字.
  • 自定義注解使用元注解(meta-annotation)進(jìn)行注解
  • 注解可以有元素,元素的形式類似于方法.但沒有方法的實(shí)現(xiàn)部分.
  • 所有注解extends java.lang.annotation 接口,不能extends其他.
  • 包含默認(rèn)值的元素,例如上例中的age,author等,在使用時(shí)可不賦值.例如
@MyCustomAnnotation(
name="LeoSun",
friendList="{"lili","xiaoming"}"
)
public classs myClass{
    //...
}

下面介紹自定義注解中使用到的四個(gè)元注解

  1. @Documentd
    在生成javadoc文檔時(shí),該注解會被生成到文檔中.
  2. @Target
    指定該注解可被使用的位置.MyCustomAnnotation注解只能被使用在方法上.Target可使用的位置為

//注解方法
ElementType.METHOD
//注解包
ElementType.PACKAGE
//注解參數(shù)
ElementType.PARAMETER
//類,接口(包括注解)或枚舉
ElementType.TYPE
ElementType.ANNOTATION_TYPE
//注解構(gòu)造函數(shù)
ElementType.CONSTRUCTOR
//注解局部變量
ElementType.LOCAL_VARIABLE
//注解屬性
ElementType.FIELD

如果注解沒有使用@Target,則表明該注解可以使用在任何元素上.

  1. @Inherited
    表明被該注解所注解的類的所有子類都會繼承該注解.例如
@MyCustomAnnotation
public class MyParentClass {
 ... 
}
public class MyChildClass extends MyParentClass {
 ... 
}

這里,MyParentClass使用了MyCustomAnnotation, MyChhildClass是MyParentClass的子類,因此,MyChhildClass也具有MyCustomAnnotation注解.

  1. @Retention
    表明被注解元素的生存期.有三種類型

//運(yùn)行期有效,可被Java反射使用
RetentionPolicy.RUNTIME
//生成在.class文件中,程序運(yùn)行期不可用
RetentionPolicy.CLASS
//被注解的元素在源代碼文件中,既不會生成到class文件,在運(yùn)行期也不可用
RetentionPolicy.SOURCE

注解創(chuàng)建完成,下一篇講述如何處理自定義的注解.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黄虱,一起剝皮案震驚了整個(gè)濱河市趁耗,隨后出現(xiàn)的幾起案子科平,更是在濱河造成了極大的恐慌羽戒,老刑警劉巖寸潦,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁捏,死亡現(xiàn)場離奇詭異挂疆,居然都是意外死亡旷痕,警方通過查閱死者的電腦和手機(jī)避消,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門低滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岩喷,你說我怎么就攤上這事恕沫。” “怎么了纱意?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵婶溯,是天一觀的道長。 經(jīng)常有香客問我偷霉,道長迄委,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任类少,我火速辦了婚禮叙身,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硫狞。我一直安慰自己信轿,他們只是感情好晃痴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著财忽,像睡著了一般倘核。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上定罢,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天笤虫,我揣著相機(jī)與錄音旁瘫,去河邊找鬼祖凫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酬凳,可吹牛的內(nèi)容都是我干的惠况。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼宁仔,長吁一口氣:“原來是場噩夢啊……” “哼稠屠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翎苫,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤权埠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后煎谍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攘蔽,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年呐粘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了满俗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡作岖,死狀恐怖唆垃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痘儡,我是刑警寧澤辕万,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站沉删,受9級特大地震影響渐尿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丑念,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一涡戳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脯倚,春花似錦渔彰、人聲如沸嵌屎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宝惰。三九已至,卻和暖如春再沧,著一層夾襖步出監(jiān)牢的瞬間尼夺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工炒瘸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淤堵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓顷扩,卻偏偏與公主長得像拐邪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子隘截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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