文章目录

  • 一、注解处理器 接收参数设置
  • 二、注解处理器 生成路由表 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 组件化】路由组件 ( 注解处理器参数选项设置 )相关推荐

  1. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo

    谈谈我对前端组件化中"组件"的理解,顺带写个Vue与React的demo 前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的 ...

  2. vue 如何处理两个组件异步问题_Vue异步组件处理路由组件加载状态的解决方案...

    vue.js 组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 在大型单页面应用中,处于对性能的考虑和首屏加载速度的要求,我们一般 ...

  3. React - 一般组件 withRouter 的使用(让一般组件具备路由组件特有的API属性)

    React - 一般组件 withRouter 的使用(让一般组件具备路由组件特有的API属性) 一. withRouter 理解 二. withRouter 使用 一. withRouter 理解 ...

  4. android 组件化_Android 组件化路由框架设计(仿Arouter)

    前言 在组件化开发中一个必须要面对的问题就是组件间页面跳转,实现的方法有很多,简单的可以通过反射获取,但是比较耗费性能,也可以通过隐式跳转,但是随着页面的增多,过滤条件会随之增多,后期维护麻烦.那还有 ...

  5. [Android]如何做一个崩溃率少于千分之三噶应用app(22)-组件化路由跳转

    大家好,我是苍王.以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章. [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 大家应该有看完我的第十二编简书 ...

  6. Android组件化之组件通信

    Demo地址:https://github.com/751496032/ComponentDemo 本文是续上一篇Android组件化方案实践与思考文章一些思考,主要是针对组件间通信,比如: 每个组件 ...

  7. iOS 组件化 —— 路由设计思路分析

    原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...

  8. Android组件化专题 - 组件化配置

    demo地址 Android组件化专题,详细讲解组件化的使用及配置,以及实现的原理. 本文章讲解了组件化的由来及配置,下期讲解页面路由跳转及路由原理与apt 1. 组件化的由来 模块化.组件化和插件化 ...

  9. android 组件化 蘑菇街,组件化在蘑菇街

    零.说点什么吧 周末是一个轻松的日子,于是决定写点什么.名字取得比较大,暂时也没有想到应该怎么命名.刚刚开始仔细的看了一下 MGJRouter 中的代码,所以一边看,也就一边的做点笔记.现在看完了,整 ...

最新文章

  1. 用python做系统程序_新手小白做毕设,想用Python做一个系统,那么该学习哪方面的知识?...
  2. 盘点Chrome 灵魂插件!爱了爱了!
  3. linux的基础知识——signal信号捕捉,信号集操作函数
  4. STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)
  5. 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
  6. 解决Execution failed for task ':app:clean'. Unable to delete directory问题
  7. 刨根问底HTTP和WebSocket协议
  8. linux运行tomcat常见问题,linux – tomcat运行,但是8080端口没有响应
  9. QQ音乐系统API接口文档
  10. css字体倾斜角度_css如何设置字体倾斜样式
  11. 网页三剑客8免费下载加序列号
  12. https工作原理及CA证书及验证证书
  13. 关于富文本编辑器的图片处理
  14. 2021110701-java前后台传递时间对象相差8个小时的时区问题
  15. STM32使用的相关知识点
  16. 十二、Python简单数据结构应用(之…
  17. CBitmap Detach和DeleteObject的关系
  18. JAVA//JAVA基本程序设计架构
  19. VBA入门到进阶常用知识代码总结40
  20. 优步UBER司机全国各地奖励政策汇总 (4月4日-4月10日)

热门文章

  1. 编程学习初体验(4. 编程的核心)
  2. [转]什么是CMMI?
  3. 心得体悟帖---15、我的灵魂
  4. gstreamer开发日志
  5. 如何查看表和索引的统计信息
  6. android zip解压缩
  7. C# 操作 Database(Access SQL)
  8. WCF中Service Configuration Editor的使用方法(转)
  9. 实践重于理论——创建一个监控程序探测WCF的并发处理机制
  10. UML-2-迭代、进化和敏捷