【Android APT】编译时技术 ( 开发编译时注解 )
文章目錄
- 一、編譯時注解
- 二、編譯時注解 使用
- 三、注解的保留時間
- 四、博客資源
一、編譯時注解
上一篇博客 【Android APT】編譯時技術 ( 編譯時注解 和 注解處理器 依賴庫 ) 中創建并配置了 annotation 編譯時注解 依賴庫 和 annotation-compiler 注解處理器 依賴庫 ;
本博客開始進行開發 編譯時注解 依賴庫 ;
開發 annotation 編譯時注解 依賴庫 ;
右鍵點擊包名 , 選擇 " New / Java Class " 選項 ,
在彈出的對話框中 , 選擇 " Annotation " 注解對話框 , 然后輸入注解名稱 BindView ,
注解源碼開發 :
package kim.hsl.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target(ElementType.FIELD) @Retention(RetentionPolicy.CLASS) public @interface BindView {int value(); }元注解解析 :
使用 @Target(ElementType.FIELD) 元注解標注該 BindView 注解 , 說明該 @BindView 注解是作用于成員變量的 ;
使用 @Retention(RetentionPolicy.CLASS) 標注 BindView 注解 , 說明該注解是 編譯時注解 ;
注解屬性解析 :
使用 value 作為注解屬性名 , 并且只有一個 注解屬性 , 因此該注解在使用的時候 , 為注解屬性賦值可以省略 " value = " , 直接傳入注解屬性值 ;
二、編譯時注解 使用
注釋掉之前的 ButterKnife 的 編譯時注解 和 注解處理器 , 使用應用中自己開發的 編譯時注解 和 注解處理器 ;
build.gradle 構建腳本 依賴庫相關配置 如下 :
dependencies {//implementation 'com.jakewharton:butterknife:10.2.3'//annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'annotationProcessor project(path: ':annotation-compiler')implementation project(path: ':annotation') }在 MainActivity 中模仿 ButterKnife 使用 @BindView 注解 , 這是我們自定義的注解 ;
package kim.hsl.apt;import android.os.Bundle; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import kim.hsl.annotation.BindView;public class MainActivity extends AppCompatActivity {@BindView(R.id.hello)TextView hello;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//hello.setText("ButterKnife");} }下一步開始使用 注解處理器 , 處理上述注解 ;
注解處理器 工作機制 : 當程序在編譯時 , 執行注解處理器 , 注解處理器會搜索整個程序中 , 使用到 BindView 注解的位置 , 并獲取注解的相關信息 , 所在字節碼文件 , 作用位置 ( 類 / 方法 / 字段等 ) ;
三、注解的保留時間
注解分類 :
① 源碼期注解 : 注解保留到源碼階段 , 只有當類是 .java 文件時才能看到 , 一旦編譯成 .class 字節碼文件 , 該注解就消失了 , 如 @Override 僅在編譯時查看父類是否有該方法 ;
② 編譯時注解 : 注解保留到字節碼階段 ;
③ 運行時注解 : 注解保留到運行時 ;
源碼期注解 與 編譯時注解 對比示例 :
查看 MainActivity.java 源碼 : 該源碼中有兩個注解 @BindView 和 @Override 兩個注解 ;
查看 BindView 注解的源碼如下 , 其中 BindView 注解是被 @Retention(RUNTIME) 修飾的 , 說明該注解是 運行時注解 , 該注解需要從源碼 到 字節碼 一直保留 , 知道運行時才開始解析該注解 ;
@Retention(RUNTIME) @Target(FIELD) public @interface BindView {/** View ID to which the field will be bound. */@IdRes int value(); }查看 Override 注解的源碼如下 , 該注解被 @Retention(RetentionPolicy.SOURCE) 修飾 , 說明該注解是 源碼期注解 , 注解信息僅在源碼階段保存 , 一旦編譯成字節碼文件 , 高注解就被刪除了 ;
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }編譯應用后 , 查看 MainActivity.class 字節碼文件 , 該字節碼文件在 " APT\app\build\intermediates\javac\debug\classes\kim\hsl\apt " 目錄下 ;
字節碼文件中的 @Override 注解已經消失 , @BindView 注解還存在 ;
@Override 注解是 源碼期注解 , 只保留到源碼期 , 編譯時使用該注解 , 編譯完成后 , 該注解就被刪除了 ;
@BindView 注解 是 運行時注解 , 該注解需要在運行時使用 , 需要一直保留到運行時 ;
四、博客資源
博客源碼 :
-
GitHub : https://github.com/han1202012/APT
-
CSDN : https://download.csdn.net/download/han1202012/18885375
總結
以上是生活随笔為你收集整理的【Android APT】编译时技术 ( 开发编译时注解 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android APT】编译时技术 (
- 下一篇: 【Android APT】注解处理器 (