日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/6/17 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】编译时技术 ( 开发编译时注解 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。