【Android APT】注解处理器 ( 注解标注 与 初始化方法 )
文章目錄
- 一、注解處理器 AbstractProcessor
- 二、使用注解 @AutoService(Processor.class) 標注 注解處理器
- 三、注解處理器 init 初始化方法
- 四、注解處理器 Filer 代碼生成工具
- 五、注解處理器 Messager 日志打印工具
- 六、博客資源
一、注解處理器 AbstractProcessor
上一篇博客 【Android APT】編譯時技術 ( 開發編譯時注解 ) 中 開發 了 annotation 編譯時注解 依賴庫 , 很簡單 , 只有一個 BindView 注解 ;
本博客開始進行開發 注解處理器 依賴庫 ;
在 【Android APT】編譯時技術 ( 編譯時注解 和 注解處理器 依賴庫 ) 博客中創建了 annotation-compiler 注解處理器 依賴庫 , 基于該基礎開發 注解處理器 ;
創建 Compiler 注解處理器 , 該類主要作用是生成代碼 , 注解處理器類必須繼承 javax.annotation.processing.AbstractProcessor 類 , 這是 Java 的 API , 再 Android 中無法獲取該 API , 因此 編譯時注解 和 注解處理器 都必須是 Java 依賴庫 ;
package kim.hsl.annotation_compiler;import java.util.Set;import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.TypeElement;/*** 生成代碼的注解處理器*/ public class Compiler extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {return false;} }二、使用注解 @AutoService(Processor.class) 標注 注解處理器
上述實現的 AbstractProcessor 中的 process 方法 , 專門用于搜索 Android 源碼中使用的 編譯時注解 的方法 ;
程序構建時 , 發現了 annotationProcessor project(path: ':annotation-compiler') 依賴 , 使用 annotationProcessor 進行依賴 , 說明這是一個注解處理器 , 此時會到 annotation-compiler 模塊中查找 注解處理器 , 注解處理器 的查找方式也是 通過 注解 標記 進行查找 , 該注解是 Google 服務庫提供的 ;
如果要使用 注解 標記注解處理器 , 首先要依賴 Google 服務庫 ,
dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'compileOnly 'com.google.auto.service:auto-service:1.0-rc3' }然后到 public class Compiler extends AbstractProcessor 注解處理器類上使用 @AutoService(Processor.class) 標注 , Android 編譯器通過查找該注解 , 確定哪個類是注解處理器 ;
import com.google.auto.service.AutoService; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.TypeElement;/*** 生成代碼的注解處理器*/ @AutoService(Processor.class) public class Compiler extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {return false;} }三、注解處理器 init 初始化方法
AbstractProcessor 注解處理器中 , 專門提供了一個 init 方法 , 該方法專門用于注解處理器相關初始化操作 ;
@Override public synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv); }init 方法的 ProcessingEnvironment processingEnv 參數很重要 , 通過該參數可以獲取 注解處理器中的各種重要工具 ;
ProcessingEnvironment 中定義了獲取相關工具的接口 ;
public interface ProcessingEnvironment {Map<String,String> getOptions();Messager getMessager();Filer getFiler();Elements getElementUtils();Types getTypeUtils();SourceVersion getSourceVersion();Locale getLocale(); }四、注解處理器 Filer 代碼生成工具
通過注解生成 Java 代碼需要使用 Filer 對象 , 將該對象定義到 注解處理器 成員變量中 , 在 init 方法中進行初始化操作 ;
通過 ProcessingEnvironment 可以通過調用 getFiler 方法 , 獲取 Filer 對象 ;
/*** 生成 Java 代碼對象*/private Filer mFiler;/*** 初始化注解處理器相關工作* @param processingEnv*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);this.mFiler = processingEnv.getFiler();}五、注解處理器 Messager 日志打印工具
注解處理器中不能打斷點進行調試 , 也不能使用 Log , System.out 打印日志 , 在注解處理器中只能通過 Messager 打印日志 ;
通過調用 ProcessingEnvironment 的 getMessager 方法 , 可以獲取到 Messager 對象 ;
/*** 日志打印*/private Messager mMessager;/*** 初始化注解處理器相關工作* @param processingEnv*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnv) {super.init(processingEnv);this.mMessager = processingEnv.getMessager();}六、博客資源
博客源碼 :
-
GitHub : https://github.com/han1202012/APT
-
CSDN :
總結
以上是生活随笔為你收集整理的【Android APT】注解处理器 ( 注解标注 与 初始化方法 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android APT】编译时技术 (
- 下一篇: 【Android APT】注解处理器 (