作為Android Coder,你瞭解註解嗎?
theme: devui-blue
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第4天,點選檢視活動詳情
前言
在日常開發中,經常使用註解,很多開源框架都提供了豐富的註解給開發者使用,如 ARouter
的 @Route(path = “/test/activity”)
、butterknife
的 @BindView(R.id.user) EditText name;
等等,那你有沒有自定義過註解,編寫過註解處理器呢?本篇就來講講...
文章總覽
註解的概念
註解(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 自帶的一個工具,用來在編譯時期處理註解資訊
總結
註解在開發中的應用是很常見的,本篇總結了註解相關知識,常見的應用場景。