日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【Android APT】编译时技术 ( 开发编译时注解 )

發(fā)布時(shí)間:2025/6/17 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android APT】编译时技术 ( 开发编译时注解 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、編譯時(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。