【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
文章目錄
- 一、注解處理器 接收參數設置
- 二、注解處理器 生成路由表 Java 代碼
- 三、博客資源
組件化系列博客 :
- 【Android 組件化】從模塊化到組件化
- 【Android 組件化】使用 Gradle 實現組件化 ( Gradle 變量定義與使用 )
- 【Android 組件化】使用 Gradle 實現組件化 ( 組件模式與集成模式切換 )
- 【Android 組件化】使用 Gradle 實現組件化 ( 組件 / 集成模式下的 Library Module 開發 )
- 【Android 組件化】路由組件 ( 路由組件結構 )
- 【Android 組件化】路由組件 ( 注解處理器獲取被注解的節點 )
- 【Android 組件化】路由組件 ( 注解處理器中使用 JavaPoet 生成代碼 )
在 【Android 組件化】路由組件 ( 注解處理器中使用 JavaPoet 生成代碼 ) 博客中在注解處理器中 , 簡單的使用了 JavaPoet 生成了 Java 代碼 ;
本篇博客中講解 " 注解處理器 " 后續開發 , 在 build.gradle 構建腳本中設置參數 , 并在注解處理器中獲取該參數 ;
一、注解處理器 接收參數設置
注解處理器只能是 Java 依賴庫 Module , 因為 注解處理器 需要繼承 javax.annotation.processing.AbstractProcessor 抽象類 , 該類在 javax 包中 , Android 中是沒有該包的 ;
注解處理器參數選項 :
注解處理器 可以接受外部參數 , 這些參數可以在 build.gradle 構建腳本中設置 ;
在注解處理器類上使用 @SupportedOptions 注解 , 設置注解處理器接收的參數 ;
// 注解處理器接收的參數 @SupportedOptions("moduleName") public class RouterProcessor extends AbstractProcessor { }SupportedOptions 注解傳入一個字符串數組 , 也可以選擇傳入一個字符串參數 ;
@Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface SupportedOptions {String[] value(); }該參數在 app 主應用 Module 的 build.gradle 中設置 , 在 " android / defaultConfig " 層級下 , 設置 javaCompileOptions 選項 , 這是 Java 編譯選項 , 設置其 注解處理器選項 annotationProcessorOptions 的 arguments 參數 ;
這里設置的參數作用是用于拼接生成 Java 源碼的類名 ;
這里設置的 moduleName 參數就是工程名 project.getName() ;
android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments = [moduleName: project.getName()]}}} }打印獲取的參數 : 在 init 方法中 , 調用 ProcessingEnvironment processingEnvironment 參數的 getOptions 方法獲取參數設置 Map 集合 , 然后獲取其 “moduleName” 鍵對應的值 , 使用 Messager 將其在編譯時打印出來 ;
// 獲取 moduleName 參數 // 先獲取 注解處理器 選項 Map<String, String> options = processingEnvironment.getOptions(); if (options != null){mModuleName = options.get("moduleName");mMessager.printMessage(Diagnostic.Kind.NOTE, "打印 moduleName 參數 : " + mModuleName); }二、注解處理器 生成路由表 Java 代碼
注解處理器完整代碼 :
package kim.hsl.router_compiler;import com.google.auto.service.AutoService; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec;import java.io.IOException; import java.util.Map; import java.util.Set;import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedOptions; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import javax.tools.Diagnostic;import kim.hsl.router_annotation.Route;// 注解處理器接收的參數 @SupportedOptions("moduleName") // 自動注冊注解處理器 @AutoService(Processor.class) // 支持的注解類型 @SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"}) // 支持的 Java 版本 @SupportedSourceVersion(SourceVersion.RELEASE_8) public class RouterProcessor extends AbstractProcessor {/*** 注解處理器中使用 Messager 對象打印日志*/private Messager mMessager;/*** 用于寫出生成的 Java 代碼*/private Filer mFiler;/*** 注解節點工具*/private Elements mElementUtils;/*** 類工具*/private Types mTypeUtils;/*** 獲取的 moduleName 參數*/private String mModuleName;/*** 該函數在初始化時調用 , 相當于構造函數* @param processingEnvironment*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);// 獲取打印日志接口this.mMessager = processingEnvironment.getMessager();// 測試日志打印mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");this.mFiler = processingEnvironment.getFiler();this.mElementUtils = processingEnvironment.getElementUtils();this.mTypeUtils = processingEnvironment.getTypeUtils();// 獲取 moduleName 參數// 先獲取 注解處理器 選項Map<String, String> options = processingEnvironment.getOptions();if (options != null){mModuleName = options.get("moduleName");mMessager.printMessage(Diagnostic.Kind.NOTE, "打印 moduleName 參數 : " + mModuleName);}}/*** 該函數在注解處理器注冊時自動執行, 是處理注解的核心函數** Set<? extends TypeElement> set 參數 : 該集合表示使用了相關注解的節點的集合** @param set* @param roundEnvironment* @return*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {return false;} }編譯執行結果 : 打印出的 moduleName 參數為 app ;
注: Messager Print Log 注: 打印 moduleName 參數 : app 注: SupportedAnnotationTypes : kim.hsl.router_annotation.Route三、博客資源
博客源碼 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下載 :
總結
以上是生活随笔為你收集整理的【Android 组件化】路由组件 ( 注解处理器参数选项设置 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字符串】最长回文子串 ( 蛮力算法 )
- 下一篇: 【Android 组件化】路由组件 (