Java 注解基礎(chǔ)

1. 注解(Annotation)

  • JDK1.5 以后版本引入的一個(gè)特性
  • 可以被其他程序(比如:編譯器)讀取
  • 語(yǔ)法 @注釋名

2. 內(nèi)置注解

  • @Override
    • 標(biāo)記重寫父類方法
  • @Deprecated
    • 標(biāo)記過(guò)時(shí)方法宅楞,表示不建議再使用
  • @SuppressWarnings
    • 抑制編譯時(shí)的警告信息
    • 需要添加參數(shù)才能正常使用,例如 @SuppressWarnings("unchecked")

3. 元注解(meta-annotation)

  • 作用:注解其他注解
  • 定義了 4 個(gè)標(biāo)準(zhǔn)的 meta-annotation 類型袱吆,用來(lái)對(duì)其他類型作說(shuō)明
    • @Target
    • @Retention
    • @Documented
    • @Inherited

3.1 @Target

  • Indicates the contexts in which an annotation type is applicable
public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE,
    TYPE_PARAMETER,
    TYPE_USE
}

3.2 @Retention

  • 描述注解的生命周期
  • SOURCE < CLASS < RUNTIME
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

public enum RetentionPolicy {
    // 保留在源碼階段厌衙,編譯時(shí)被丟棄
    SOURCE,
    // 保留到編譯進(jìn)行時(shí)的class文件,但 JVM 加載class文件時(shí)候被遺棄
    CLASS,
    // 保留到程序運(yùn)行時(shí)
    RUNTIME
}

3.3 @Documented

  • 將被記錄在 javadoc 中

3.4 @Inherited

  • 子類可以繼承父類的注解

4. 自定義注解

  • 定義注解用 @interface, 注解中只能包含屬性
  • 里面的方法實(shí)際上是聲明的屬性绞绒,方法名稱就是屬性名稱婶希,返回值類型就是屬性的類型
  • 若只有一個(gè)屬性,一般名為 value
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EntryLog {
  // 屬性 value
  String value() default "";
  String[] codes() default {};
}

若屬性沒(méi)有默認(rèn)值蓬衡,必須給注解賦值

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EntryLog {
  String value() default "";
  String[] codes();
}
// 需給注解賦值
@EntryLog(codes = {"1001", "1002"})

4.1 注解屬性類型

  • 基本數(shù)據(jù)類型
  • String 類型
  • Class 類型
  • 枚舉類型
  • 注解類型
  • 以上類型的一維數(shù)組

數(shù)組用 {} 來(lái)存儲(chǔ)喻杈,當(dāng)數(shù)組中只有一個(gè)值時(shí)可省略 {}

// 數(shù)組類型 String[] codes();
@EntryLog(codes = "1001")
@EntryLog(codes = {"1001", "1002"})

// 枚舉數(shù)組類型  ElementType[] value();
@Target(ElementType.TYPE)
@Target({ElementType.TYPE, ElementType.METHOD})

4.2 反編譯文件

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface EntryLog {
    int num() default 0;
    String value();
    // Class 類型
    Class<?> clazz();
    // 枚舉類型
    CodeEnum codeEnum();
    // 注解類型
    DemoAnno demoAnno();
}
// 自動(dòng)繼承 java.lang.annotation.Annotation 接口
public interface EntryLog extends java.lang.annotation.Annotation {
  public abstract int num();
  public abstract java.lang.String value();
  public abstract java.lang.Class<?> clazz();
  public abstract com.example.concrete.CodeEnum codeEnum();
  public abstract com.example.concrete.DemoAnno demoAnno();
}
public interface Annotation {
  boolean equals(Object obj);
  int hashCode();
  String toString();
  Class<? extends Annotation> annotationType();
}

5. Spring 注解 @AliasFor

  • @AliasFor 用于聲明注釋屬性別名

同一個(gè)注解中的兩個(gè)屬性互為別名
例如:@ComponentScan 注解中,value 和 basePackages 兩個(gè)屬性互為別名

public @interface ComponentScan {
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};
}

跨注解的屬性別名
例如:@Service#value的值可以映射到@Component#value

public @interface Service {
    @AliasFor(annotation = Component.class)
    String value() default "";
}
public @interface Component {
    String value() default "";
}

5.1 @SpringBootApplication 分析

public @interface SpringBootApplication {
    @AliasFor(annotation = EnableAutoConfiguration.class)
    Class<?>[] exclude() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};
}

其他

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撤蟆,一起剝皮案震驚了整個(gè)濱河市奕塑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌家肯,老刑警劉巖龄砰,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異讨衣,居然都是意外死亡换棚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門反镇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)固蚤,“玉大人,你說(shuō)我怎么就攤上這事歹茶∠ν妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵惊豺,是天一觀的道長(zhǎng)燎孟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)尸昧,這世上最難降的妖魔是什么揩页? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烹俗,結(jié)果婚禮上爆侣,老公的妹妹穿的比我還像新娘萍程。我一直安慰自己,他們只是感情好兔仰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布茫负。 她就那樣靜靜地躺著,像睡著了一般乎赴。 火紅的嫁衣襯著肌膚如雪朽褪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天无虚,我揣著相機(jī)與錄音,去河邊找鬼衍锚。 笑死友题,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戴质。 我是一名探鬼主播度宦,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼告匠!你這毒婦竟也來(lái)了戈抄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤后专,失蹤者是張志新(化名)和其女友劉穎划鸽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戚哎,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裸诽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了型凳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈冬。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甘畅,靈堂內(nèi)的尸體忽然破棺而出埂蕊,到底是詐尸還是另有隱情,我是刑警寧澤疏唾,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布蓄氧,位于F島的核電站,受9級(jí)特大地震影響荸实,放射性物質(zhì)發(fā)生泄漏匀们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一准给、第九天 我趴在偏房一處隱蔽的房頂上張望泄朴。 院中可真熱鬧重抖,春花似錦、人聲如沸祖灰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)局扶。三九已至恨统,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間三妈,已是汗流浹背畜埋。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畴蒲,地道東北人悠鞍。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像模燥,于是被迫代替她去往敵國(guó)和親咖祭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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