【Android APT】编译时技术 ( 开发编译时注解 )
文章目錄
- 一、編譯時(shí)注解
- 二、編譯時(shí)注解 使用
- 三、注解的保留時(shí)間
- 四、博客資源
一、編譯時(shí)注解
上一篇博客 【Android APT】編譯時(shí)技術(shù) ( 編譯時(shí)注解 和 注解處理器 依賴庫(kù) ) 中創(chuàng)建并配置了 annotation 編譯時(shí)注解 依賴庫(kù) 和 annotation-compiler 注解處理器 依賴庫(kù) ;
本博客開(kāi)始進(jìn)行開(kāi)發(fā) 編譯時(shí)注解 依賴庫(kù) ;
開(kāi)發(fā) annotation 編譯時(shí)注解 依賴庫(kù) ;
右鍵點(diǎn)擊包名 , 選擇 " New / Java Class " 選項(xiàng) ,
在彈出的對(duì)話框中 , 選擇 " Annotation " 注解對(duì)話框 , 然后輸入注解名稱 BindView ,
注解源碼開(kāi)發(fā) :
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) 元注解標(biāo)注該 BindView 注解 , 說(shuō)明該 @BindView 注解是作用于成員變量的 ;
使用 @Retention(RetentionPolicy.CLASS) 標(biāo)注 BindView 注解 , 說(shuō)明該注解是 編譯時(shí)注解 ;
注解屬性解析 :
使用 value 作為注解屬性名 , 并且只有一個(gè) 注解屬性 , 因此該注解在使用的時(shí)候 , 為注解屬性賦值可以省略 " value = " , 直接傳入注解屬性值 ;
二、編譯時(shí)注解 使用
注釋掉之前的 ButterKnife 的 編譯時(shí)注解 和 注解處理器 , 使用應(yīng)用中自己開(kāi)發(fā)的 編譯時(shí)注解 和 注解處理器 ;
build.gradle 構(gòu)建腳本 依賴庫(kù)相關(guān)配置 如下 :
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");} }下一步開(kāi)始使用 注解處理器 , 處理上述注解 ;
注解處理器 工作機(jī)制 : 當(dāng)程序在編譯時(shí) , 執(zhí)行注解處理器 , 注解處理器會(huì)搜索整個(gè)程序中 , 使用到 BindView 注解的位置 , 并獲取注解的相關(guān)信息 , 所在字節(jié)碼文件 , 作用位置 ( 類 / 方法 / 字段等 ) ;
三、注解的保留時(shí)間
注解分類 :
① 源碼期注解 : 注解保留到源碼階段 , 只有當(dāng)類是 .java 文件時(shí)才能看到 , 一旦編譯成 .class 字節(jié)碼文件 , 該注解就消失了 , 如 @Override 僅在編譯時(shí)查看父類是否有該方法 ;
② 編譯時(shí)注解 : 注解保留到字節(jié)碼階段 ;
③ 運(yùn)行時(shí)注解 : 注解保留到運(yùn)行時(shí) ;
源碼期注解 與 編譯時(shí)注解 對(duì)比示例 :
查看 MainActivity.java 源碼 : 該源碼中有兩個(gè)注解 @BindView 和 @Override 兩個(gè)注解 ;
查看 BindView 注解的源碼如下 , 其中 BindView 注解是被 @Retention(RUNTIME) 修飾的 , 說(shuō)明該注解是 運(yùn)行時(shí)注解 , 該注解需要從源碼 到 字節(jié)碼 一直保留 , 知道運(yùn)行時(shí)才開(kāi)始解析該注解 ;
@Retention(RUNTIME) @Target(FIELD) public @interface BindView {/** View ID to which the field will be bound. */@IdRes int value(); }查看 Override 注解的源碼如下 , 該注解被 @Retention(RetentionPolicy.SOURCE) 修飾 , 說(shuō)明該注解是 源碼期注解 , 注解信息僅在源碼階段保存 , 一旦編譯成字節(jié)碼文件 , 高注解就被刪除了 ;
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }編譯應(yīng)用后 , 查看 MainActivity.class 字節(jié)碼文件 , 該字節(jié)碼文件在 " APT\app\build\intermediates\javac\debug\classes\kim\hsl\apt " 目錄下 ;
字節(jié)碼文件中的 @Override 注解已經(jīng)消失 , @BindView 注解還存在 ;
@Override 注解是 源碼期注解 , 只保留到源碼期 , 編譯時(shí)使用該注解 , 編譯完成后 , 該注解就被刪除了 ;
@BindView 注解 是 運(yùn)行時(shí)注解 , 該注解需要在運(yùn)行時(shí)使用 , 需要一直保留到運(yùn)行時(shí) ;
四、博客資源
博客源碼 :
-
GitHub : https://github.com/han1202012/APT
-
CSDN : https://download.csdn.net/download/han1202012/18885375
總結(jié)
以上是生活随笔為你收集整理的【Android APT】编译时技术 ( 开发编译时注解 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android APT】编译时技术 (
- 下一篇: 【Android APT】注解处理器 (