【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
文章目錄
- 一、注解處理器 接收參數(shù)設(shè)置
- 二、注解處理器 生成路由表 Java 代碼
- 三、博客資源
組件化系列博客 :
- 【Android 組件化】從模塊化到組件化
- 【Android 組件化】使用 Gradle 實現(xiàn)組件化 ( Gradle 變量定義與使用 )
- 【Android 組件化】使用 Gradle 實現(xiàn)組件化 ( 組件模式與集成模式切換 )
- 【Android 組件化】使用 Gradle 實現(xiàn)組件化 ( 組件 / 集成模式下的 Library Module 開發(fā) )
- 【Android 組件化】路由組件 ( 路由組件結(jié)構(gòu) )
- 【Android 組件化】路由組件 ( 注解處理器獲取被注解的節(jié)點 )
- 【Android 組件化】路由組件 ( 注解處理器中使用 JavaPoet 生成代碼 )
在 【Android 組件化】路由組件 ( 注解處理器中使用 JavaPoet 生成代碼 ) 博客中在注解處理器中 , 簡單的使用了 JavaPoet 生成了 Java 代碼 ;
本篇博客中講解 " 注解處理器 " 后續(xù)開發(fā) , 在 build.gradle 構(gòu)建腳本中設(shè)置參數(shù) , 并在注解處理器中獲取該參數(shù) ;
一、注解處理器 接收參數(shù)設(shè)置
注解處理器只能是 Java 依賴庫 Module , 因為 注解處理器 需要繼承 javax.annotation.processing.AbstractProcessor 抽象類 , 該類在 javax 包中 , Android 中是沒有該包的 ;
注解處理器參數(shù)選項 :
注解處理器 可以接受外部參數(shù) , 這些參數(shù)可以在 build.gradle 構(gòu)建腳本中設(shè)置 ;
在注解處理器類上使用 @SupportedOptions 注解 , 設(shè)置注解處理器接收的參數(shù) ;
// 注解處理器接收的參數(shù) @SupportedOptions("moduleName") public class RouterProcessor extends AbstractProcessor { }SupportedOptions 注解傳入一個字符串?dāng)?shù)組 , 也可以選擇傳入一個字符串參數(shù) ;
@Documented @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface SupportedOptions {String[] value(); }該參數(shù)在 app 主應(yīng)用 Module 的 build.gradle 中設(shè)置 , 在 " android / defaultConfig " 層級下 , 設(shè)置 javaCompileOptions 選項 , 這是 Java 編譯選項 , 設(shè)置其 注解處理器選項 annotationProcessorOptions 的 arguments 參數(shù) ;
這里設(shè)置的參數(shù)作用是用于拼接生成 Java 源碼的類名 ;
這里設(shè)置的 moduleName 參數(shù)就是工程名 project.getName() ;
android {defaultConfig {javaCompileOptions {annotationProcessorOptions {arguments = [moduleName: project.getName()]}}} }打印獲取的參數(shù) : 在 init 方法中 , 調(diào)用 ProcessingEnvironment processingEnvironment 參數(shù)的 getOptions 方法獲取參數(shù)設(shè)置 Map 集合 , 然后獲取其 “moduleName” 鍵對應(yīng)的值 , 使用 Messager 將其在編譯時打印出來 ;
// 獲取 moduleName 參數(shù) // 先獲取 注解處理器 選項 Map<String, String> options = processingEnvironment.getOptions(); if (options != null){mModuleName = options.get("moduleName");mMessager.printMessage(Diagnostic.Kind.NOTE, "打印 moduleName 參數(shù) : " + 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;// 注解處理器接收的參數(shù) @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;/*** 注解節(jié)點工具*/private Elements mElementUtils;/*** 類工具*/private Types mTypeUtils;/*** 獲取的 moduleName 參數(shù)*/private String mModuleName;/*** 該函數(shù)在初始化時調(diào)用 , 相當(dāng)于構(gòu)造函數(shù)* @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 參數(shù)// 先獲取 注解處理器 選項Map<String, String> options = processingEnvironment.getOptions();if (options != null){mModuleName = options.get("moduleName");mMessager.printMessage(Diagnostic.Kind.NOTE, "打印 moduleName 參數(shù) : " + mModuleName);}}/*** 該函數(shù)在注解處理器注冊時自動執(zhí)行, 是處理注解的核心函數(shù)** Set<? extends TypeElement> set 參數(shù) : 該集合表示使用了相關(guān)注解的節(jié)點的集合** @param set* @param roundEnvironment* @return*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {return false;} }編譯執(zhí)行結(jié)果 : 打印出的 moduleName 參數(shù)為 app ;
注: Messager Print Log 注: 打印 moduleName 參數(shù) : app 注: SupportedAnnotationTypes : kim.hsl.router_annotation.Route三、博客資源
博客源碼 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下載 :
總結(jié)
以上是生活随笔為你收集整理的【Android 组件化】路由组件 ( 注解处理器参数选项设置 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字符串】最长回文子串 ( 蛮力算法 )
- 下一篇: 【Android 组件化】路由组件 (