你真的理解Java 註解嗎?

你真的理解Java 註解嗎?

一、什麼是註解?

官方解釋:java

Java 註解用於爲 Java 代碼提供元數據。做爲元數據,註解不直接影響你的代碼執行,但也有一些類型的註解實際上能夠用於這一目的。Java 註解是從 Java5 開始添加到 Java 的。git

我的理解:github

註解≈標籤數組

二、註解的使用場景?

咱們先不談如何實現註解,咱們從需求出發,先看看註解該如何使用。安全

  • 生成文檔。這是最多見的,也是java 最先提供的註解。經常使用的有@param @return 等
  • 跟蹤代碼依賴性,實現替代配置文件功能。好比Dagger 2依賴注入,將來java開發,將大量註解配置,具備很大用處;
  • 在編譯時進行格式檢查。如@override 放在方法前,若是你這個方法並非覆蓋了超類方法,則編譯時就能檢查出。

三、註解原理

  註解本質是一個繼承了Annotation的特殊接口,其具體實現類是Java運行時生成的動態代理類。而咱們經過反射獲取註解時,返回的是Java運行時生成的動態代理對象$Proxy1。經過代理對象調用自定義註解(接口)的方法,會最終調用AnnotationInvocationHandler的invoke方法。該方法會從memberValues這個Map中索引出對應的值。而memberValues的來源是Java常量池。ide

四、註解類型

  • 元註解
  • Java 內置註解
  • 自定義註解

(1)元註解函數

  • @Retention:描述註解生命週期,例如@Retention(RetentionPolicy.RUNTIME)
  • @Documented:將註解中的元素包含到 Javadoc文檔中
  • @Target:限定了註解做用的目標範圍,包括類、方法等等
  • @Inherited:使得一個 被@Inherited註解的註解 做用的類的子類能夠繼承該類的註解
  • @Repeatable:使得做用的註解能夠取多個值(Java1.8)

(2)Java 內置註解代理

  • @Deprecated:標記已過期 & 被拋棄的元素(類、方法等)
  • @Override:標記該方法須要被子類複寫
  • @SuppressWarnings:標記的元素會阻止編譯器發出警告提醒 (主要應用於開發者須要忽略警告時)
  • @SafeVarargs:提醒開發者不要用參數作不安全的操做 & 阻止編譯器產生 unchecked警告(1.7引入)
  • @FunctionalInterface:表示該接口 = 函數式接口(1.8引入,例如Runnable接口就是使用了該註解)

16415bcabef1da6a

(3)自定義註解code

定義一個註解對象

// 經過 @interface 關鍵字進行定義
// 形式相似於接口,區別在於多了一個 @ 符號
public @interface MyAnnotation {
    // 註解的屬性 = 成員變量
    // 註解只有成員變量,沒有方法

    // 註解@MyAnnotation中有2個屬性:id 和 msg  
    int id();
    String msg() default "Hi" ;

    // 說明:
    // 註解的屬性以 「無形參的方法」 形式來聲明
    // 方法名 = 屬性名
    // 方法返回值 = 屬性類型 = 8 種基本數據類型 + 類、接口、註解及對應數組類型
    // 用 default 關鍵值指定 屬性的默認值,如上面的msg的默認值 = 」Hi「
}

Demo地址以下:

https://github.com/Taoey/DAS/tree/master/JavaBase/src/main/java/annotation

相關文章
相關標籤/搜索