Java註解在Android中必須學習的細節知識

前言

對於註解,相信你們都不陌生了,可是這種熟悉對於Android開發者來講,也就是僅僅是它認識你,你不認識它吧,由於,咱們幾乎都停留在用上了。像dagger2,像retrofit,像greenDao,他們都是滿滿的使用了註解,而咱們只是停留在知其然缺不知其因此然的層面,那麼我本次分享講分紅幾批博客共享給你們一個體系的又不失針對Android平臺須要的恰到好處的給你們整理真正須要掌握的知識體系。面試

註解

註解的定義

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

註解即標籤

若是把代碼想象成一個具備生命的個體,註解就是給這些代碼的某些個體打標籤bash

如何自定義註解

  • 註解經過 @interface關鍵字進行定義。
public @interface Test {
}複製代碼

它的形式跟接口很相似,不過前面多了一個 @ 符號。上面的代碼就建立了一個名字爲 Test 的註解。微信

你能夠簡單理解爲建立了一張名字爲 Test的標籤。markdown

  • 使用註解
@Test
public class TestAnnotation {
}複製代碼

建立一個類 TestAnnotation,而後在類定義的地方加上 @Test就能夠用 Test註解這個類了架構

你能夠簡單理解爲將 Test 這張標籤貼到 TestAnnotation這個類上面。工具

元註解

元註解是能夠註解到註解上的註解,或者說元註解是一種基本註解,可是它可以應用到其它的註解上面。spa

若是難於理解的話,你能夠這樣理解。元註解也是一張標籤,可是它是一張特殊的標籤,它的做用和目的就是給其餘普通的標籤進行解釋說明的。code

元標籤有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 種。orm

  • @Retention
  • Retention 的英文意爲保留期的意思。當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。
  • 它的取值以下:
  1. RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
  2. RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。
  3. RetentionPolicy.RUNTIME 註解能夠保留到程序運行的時候,它會被加載進入到 JVM 中,因此在程序運行時能夠獲取到它們
  • @Target
  • Target 是目標的意思,@Target 指定了註解運用的地方
  • 你能夠這樣理解,當一個註解被 @Target 註解時,這個註解就被限定了運用的場景。
  • 類比到標籤,本來標籤是你想張貼到哪一個地方就到哪一個地方,可是由於 @Target 的存在,它張貼的地方就很是具體了,好比只能張貼到方法上、類上、方法參數上等等。@Target 有下面的取值
  1. ElementType.ANNOTATION_TYPE 能夠給一個註解進行註解
  2. ElementType.CONSTRUCTOR 能夠給構造方法進行註解
  3. ElementType.FIELD 能夠給屬性進行註解
  4. ElementType.LOCAL_VARIABLE 能夠給局部變量進行註解
  5. ElementType.METHOD 能夠給方法進行註解
  6. ElementType.PACKAGE 能夠給一個包進行註解
  7. ElementType.PARAMETER 能夠給一個方法內的參數進行註解
  • @Documented
  • 顧名思義,這個元註解確定是和文檔有關。它的做用是可以將註解中的元素包含到 Javadoc 中去。ElementType.TYPE 能夠給一個類型進行註解,好比類、接口、枚舉
  • @Inherited
  • Inherited 是繼承的意思,可是它並非說註解自己能夠繼承,而是說若是一個超類被 @Inherited 註解過的註解進行註解的話,那麼若是它的子類沒有被任何註解應用的話,那麼這個子類就繼承了超類的註解。
  • @Repeatable
  • Repeatable 天然是可重複的意思。@Repeatable 是 Java 1.8 才加進來的,因此算是一個新的特性。
  • 什麼樣的註解會屢次應用呢?一般是註解的值能夠同時取多個。

註解的屬性

註解的屬性也叫作成員變量。註解只有成員變量,沒有方法。

須要注意的是,在註解中定義屬性時它的類型必須是 8 種基本數據類型外加 類、接口、註解及它們的數組

註解中屬性能夠有默認值,默認值須要用 default 關鍵值指定

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{
int id() default -1;
String msg() default "Hello";
}複製代碼

上面代碼定義了 TestAnnotation 這個註解中擁有 id 和 msg 兩個屬性。在使用的時候,咱們應該給它們進行賦值。

賦值的方式是在註解的括號內以 value="" 形式,多個屬性以前用 ,隔開

@Test(id=1,msg="hello annotation")
public class TestAnnotation {
}複製代碼

註解的提取

註解與反射。

註解經過反射獲取。首先能夠經過 Class 對象的 isAnnotationPresent() 方法判斷它是否應用了某個註解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}複製代碼

而後經過 getAnnotation() 方法來獲取 Annotation 對象。

public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {複製代碼

或者是 getAnnotations() 方法。

public Annotation[] getAnnotations() {}複製代碼

前一種方法返回指定類型的註解,後一種方法返回註解到這個元素上的全部註解。

若是獲取到的 Annotation 若是不爲 null,則就能夠調用它們的屬性方法了。好比

@Test()
public class TestDemo{
public static void main(String[] args) {
    boolean hasAnnotation =                  TestDemo.class.isAnnotationPresent(Test.class);
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation =     TestDemo.class.getAnnotation(Test.class);
            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
    }
}複製代碼

註解的使用場景

  • 提供信息給編譯器: 編譯器能夠利用註解來探測錯誤和警告信息
  • 編譯階段時的處理: 軟件工具能夠用來利用註解信息來生成代碼、Html文檔或者作其它相應處理。
  • 運行時的處理: 某些註解能夠在程序運行的時候接受代碼的提取
  • 值得注意的是,註解不是代碼自己的一部分。

最後

讀到這的朋友以爲不錯能夠點贊關注下,感謝您的支持,之後會不停更新更多精選乾貨及資訊分享,歡迎你們在評論區留言討論!

歡迎關注享學課堂online微信公衆號,天天會持續更新技術乾貨,熱點,吐槽等文章,還有免費的Android架構視頻資料和麪試專題資料免費領取分享,後臺回覆關鍵字【Android資料】,免費獲取Android架構面試專題文檔資料、電子書及更多架構進階視頻資料(視頻+筆記)

相關文章
相關標籤/搜索