作為Android Coder,你瞭解註解嗎?

語言: CN / TW / HK

theme: devui-blue

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第4天,點選檢視活動詳情

前言

在日常開發中,經常使用註解,很多開源框架都提供了豐富的註解給開發者使用,如 ARouter@Route(path = “/test/activity”)butterknife@BindView(R.id.user) EditText name; 等等,那你有沒有自定義過註解,編寫過註解處理器呢?本篇就來講講...

文章總覽

註解(Annotations)

註解的概念

註解(Annotations),是元資料的一種形式,它不屬於程式本身。對所註解程式碼的操作沒有直接影響。

註解的多種用途:

  • 執行時處理:註解可以在執行時檢查

  • 為編譯器提供資訊:編譯器可以使用註解來檢查錯誤

  • 編譯或部署時處理:可生成程式碼、XML、檔案等

註解的格式

java @Any class MyClass { … }

註解以 @ 開頭後面跟上內容,註解允許包含元素:

java @Any(id=666, value = "zby") class MyClass { … }

若只有一個 value 元素,則可省略;若沒有元素,則可省略括號:

```java @Any("zby") // 只有一個 value 元素 class MyClass { … }

@Any // 沒有元素 class MyClass { … } ```

若註解有相同型別元素,則是重複註解:

java @Any("Cheen") @Any("Zby") class MyClass { … }

註解的宣告

註解定義類似於介面的定義,在關鍵字 interface 前加 @

java @interface Any { // interface 前加 @ int id(); String value(); }

註解型別

int id()String value() 是註解型別(annotation type),可定義可選的預設值:

java @interface Any { int id(); String value() default "zby"; }

在使用註解時,若定義的註解型別沒有預設值,則必須進行賦值:

java @Any(id = 666) // id 必須要賦值,@Any 會提示 id 必須賦值 class MyClass { … }

元註解

標註在自定義註解上方的為元註解(meta-annotations)

java @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) // 這裡 Target Retention 是元註解 @interface Any { int id(); String value() default “zby”; }

java.lang.annotation 中定義了幾種元註解(@Retention、@Target是常使用的),如

@Retention 指定註解的儲存方式,RetentionPolicy.java 示例如下:

java public enum RetentionPolicy { SOURCE, // 標記的註解僅保留在原始碼級別中,並被編譯器忽略 CLASS, // 標記的註解在編譯時由編譯器保留,但 JVM 會忽略 RUNTIME // 標記的註解由 JVM 保留,執行時環境可以使用 }

@Target 指定註解可使用的範圍, ElementType.java 示例如下:

java public enum ElementType { TYPE, // 類 FIELD, // 欄位或屬性 METHOD, // 方法 PACKAGE, // 包 TYPE_PARAMETER // 引數 }

對於 TYPE_PARAMETER (型別引數) ,若把 Target 設定成 @Target({ElementType.TYPE_PARAMETER}),表示可使用在泛型的型別引數上:

java public class TypeParameterClass<@Any T> { public <@Any T> T foo(T t) { return null; } }

@Documented 表示使用指定的註解,將使用 Javadoc 工具記錄這些元素

@Inherited 表示註解型別可以從父類繼承

@Repeatable 表明標記的註解可以多次應用於同一宣告或型別使用。

註解應用場景

根據 @Retention 元註解定義的儲存方式,註解一般可使用在以下3種場景:

| 級別 | 技術 | 說明 | | :----- | :--------- | :----------------------------------------------------------- | | 原始碼 | APT | 在編譯期能獲取註解與註解宣告的類和成員資訊,一般用於生成額外的輔助類 | | 位元組碼 | 位元組碼增強 | 在編譯出Class後,通過修改Class資料以實現修改程式碼邏輯目的,對於是否需要修改的區分或者修改為不同邏輯的判斷可以使用註解 | | 執行時 | 反射 | 在程式執行時,通過反射技術動態獲取註解與其元素,完成不同的邏輯判斷 |

APT註解處理器

APT(Annotation Processor Tools) 註解處理器,專用於處理註解。編寫好的 Java 檔案,需要經過 Javac 命令編譯,編譯為JVM 能夠載入的位元組碼檔案,註解處理器是 Javac 自帶的一個工具,用來在編譯時期處理註解資訊

總結

註解在開發中的應用是很常見的,本篇總結了註解相關知識,常見的應用場景。