【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
文章目錄
- 一、設(shè)置支持的注解類型
- 二、注解處理器中打印日志
- 三、主應(yīng)用中使用注解
- 四、注解處理器 獲取注解節(jié)點(diǎn)
- 五、博客資源
組件化系列博客 :
- 【Android 組件化】從模塊化到組件化
- 【Android 組件化】使用 Gradle 實(shí)現(xiàn)組件化 ( Gradle 變量定義與使用 )
- 【Android 組件化】使用 Gradle 實(shí)現(xiàn)組件化 ( 組件模式與集成模式切換 )
- 【Android 組件化】使用 Gradle 實(shí)現(xiàn)組件化 ( 組件 / 集成模式下的 Library Module 開(kāi)發(fā) )
- 【Android 組件化】路由組件 ( 路由組件結(jié)構(gòu) )
- 【Android 組件化】路由組件 ( 注解處理器獲取被注解的節(jié)點(diǎn) )
在 【Android 組件化】路由組件 ( 路由組件結(jié)構(gòu) ) 博客中介紹了組件化中的 " 路由組件 " , 分為 " 自定義注解模塊 " , " 注解處理器模塊 " , " 依賴庫(kù)模塊 " 333 個(gè)模塊 ;
本篇博客中講解 " 注解處理器 " 開(kāi)發(fā) ;
一、設(shè)置支持的注解類型
在 注解處理器 類上使用 @SupportedAnnotationTypes({}) 注解 , 為該 注解處理器 配置支持的注解 , 在大括號(hào)中輸入 注解的完整 " 包名.類名 " 字符串 , 多個(gè)注解名稱之間使用逗號(hào) , 隔開(kāi) ;
@SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"}) public class RouterProcessor extends AbstractProcessor { }也可以在 getSupportedAnnotationTypes 函數(shù)中設(shè)置支持的注解類型 ;
/*** 指明注解處理器可以處理哪些注解** @return 字符串類型 Set 集合*/@Overridepublic Set<String> getSupportedAnnotationTypes() {return super.getSupportedAnnotationTypes();}上述兩種方法二選一 ;
二、注解處理器中打印日志
注解處理器 中 , 使用 javax.annotation.processing.Messager 打印數(shù)據(jù) , 在 init 方法中 , 通過(guò)調(diào)用 ProcessingEnvironment processingEnvironment 參數(shù)的 getMessager 方法 , 獲取 Messager 對(duì)象 ;
調(diào)用 Messager 對(duì)象的 printMessage 方法 , 打印日志 , 傳入第 111 個(gè)參數(shù)是日志級(jí)別 , 一般設(shè)置成 Diagnostic.Kind.NOTE 參數(shù) , 第二個(gè)參數(shù)是要打印的字符串 ;
打印結(jié)果輸出到 Build 面板中 ;
代碼示例 :
public class RouterProcessor extends AbstractProcessor {/*** 注解處理器中使用 Messager 對(duì)象打印日志*/private Messager mMessager;/*** 該函數(shù)在初始化時(shí)調(diào)用 , 相當(dāng)于構(gòu)造函數(shù)* @param processingEnvironment*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);// 獲取打印日志接口mMessager = processingEnvironment.getMessager();mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");} }三、主應(yīng)用中使用注解
在主應(yīng)用的 build.gradle 構(gòu)建腳本中 , 引入注解處理器 與 注解類 依賴 ,
dependencies {// 引入注解處理器annotationProcessor project(':router-compiler')// 引入注解implementation project(':router-annotation') }Java 類中使用 Route 注解 ;
package kim.hsl.component;import android.app.Activity; import android.os.Bundle;import androidx.annotation.Nullable;import kim.hsl.router_annotation.Route;@Route(path = "app/MainActivity") public class MainActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} }四、注解處理器 獲取注解節(jié)點(diǎn)
使用 @Route 注解的節(jié)點(diǎn)都是類 , 因此注解節(jié)點(diǎn)的類型都是 TypeElement 類型 ;
編譯時(shí) , 注解處理器會(huì)自動(dòng)獲取使用了 @Route 注解的節(jié)點(diǎn) , 在 注解處理器 的 process 方法中 , 可以獲取到這些使用了注解的 TypeElement 節(jié)點(diǎn) ;
package kim.hsl.router_compiler;import com.google.auto.service.AutoService;import java.util.Set;import javax.annotation.processing.AbstractProcessor; 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.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic;// 自動(dòng)注冊(cè)注解處理器 @AutoService(Processor.class) // 支持的注解類型 @SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"}) // 支持的 Java 版本 @SupportedSourceVersion(SourceVersion.RELEASE_8) public class RouterProcessor extends AbstractProcessor {/*** 注解處理器中使用 Messager 對(duì)象打印日志*/private Messager mMessager;/*** 該函數(shù)在初始化時(shí)調(diào)用 , 相當(dāng)于構(gòu)造函數(shù)* @param processingEnvironment*/@Overridepublic synchronized void init(ProcessingEnvironment processingEnvironment) {super.init(processingEnvironment);// 獲取打印日志接口mMessager = processingEnvironment.getMessager();mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");}/*** 該函數(shù)在注解處理器注冊(cè)時(shí)自動(dòng)執(zhí)行, 是處理注解的核心函數(shù)** Set<? extends TypeElement> set 參數(shù) : 該集合表示使用了相關(guān)注解的節(jié)點(diǎn)的集合** @param set* @param roundEnvironment* @return*/@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {for (TypeElement typeElement: set){mMessager.printMessage(Diagnostic.Kind.NOTE, "SupportedAnnotationTypes : " + typeElement.getQualifiedName());}return false;} }在編譯時(shí) , 在 " Build " 面板中的 " Build Output " 模塊中 , 輸出 注解處理器 使用 Messager 打印的日志 ;
打印的內(nèi)容是檢測(cè)到的在 Android 應(yīng)用中所有使用到的 " kim.hsl.router_annotation.Route" 類型注解的節(jié)點(diǎn) ;
在主應(yīng)用中使用了 @Route(path = "app/MainActivity") 節(jié)點(diǎn)修飾了 MainActivity , 使用了一次該注解 , 因此在 注解處理器 的 process 方法中 , 可以獲取到該注解信息 ;
在 Java 代碼中使用了多少次 @Route 注解 , 則在 注解處理器 的 process 方法中就可以獲取到對(duì)應(yīng)次數(shù)的 注解節(jié)點(diǎn) ;
編譯時(shí)輸出的日志內(nèi)容 :
注: Messager Print Log 注: SupportedAnnotationTypes : kim.hsl.router_annotation.Route五、博客資源
博客源碼 :
- GitHub : https://github.com/han1202012/Component
- CSDN 下載 :
總結(jié)
以上是生活随笔為你收集整理的【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【错误记录】Android 编译时技术版
- 下一篇: 【错误记录】Android 编译时技术报