【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 组件化】路由组件 ( 注解处理器参数选项设置 )相关推荐
- 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo
谈谈我对前端组件化中"组件"的理解,顺带写个Vue与React的demo 前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的 ...
- vue 如何处理两个组件异步问题_Vue异步组件处理路由组件加载状态的解决方案...
vue.js 组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 在大型单页面应用中,处于对性能的考虑和首屏加载速度的要求,我们一般 ...
- React - 一般组件 withRouter 的使用(让一般组件具备路由组件特有的API属性)
React - 一般组件 withRouter 的使用(让一般组件具备路由组件特有的API属性) 一. withRouter 理解 二. withRouter 使用 一. withRouter 理解 ...
- android 组件化_Android 组件化路由框架设计(仿Arouter)
前言 在组件化开发中一个必须要面对的问题就是组件间页面跳转,实现的方法有很多,简单的可以通过反射获取,但是比较耗费性能,也可以通过隐式跳转,但是随着页面的增多,过滤条件会随之增多,后期维护麻烦.那还有 ...
- [Android]如何做一个崩溃率少于千分之三噶应用app(22)-组件化路由跳转
大家好,我是苍王.以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章. [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 大家应该有看完我的第十二编简书 ...
- Android组件化之组件通信
Demo地址:https://github.com/751496032/ComponentDemo 本文是续上一篇Android组件化方案实践与思考文章一些思考,主要是针对组件间通信,比如: 每个组件 ...
- iOS 组件化 —— 路由设计思路分析
原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...
- Android组件化专题 - 组件化配置
demo地址 Android组件化专题,详细讲解组件化的使用及配置,以及实现的原理. 本文章讲解了组件化的由来及配置,下期讲解页面路由跳转及路由原理与apt 1. 组件化的由来 模块化.组件化和插件化 ...
- android 组件化 蘑菇街,组件化在蘑菇街
零.说点什么吧 周末是一个轻松的日子,于是决定写点什么.名字取得比较大,暂时也没有想到应该怎么命名.刚刚开始仔细的看了一下 MGJRouter 中的代码,所以一边看,也就一边的做点笔记.现在看完了,整 ...
最新文章
- 用python做系统程序_新手小白做毕设,想用Python做一个系统,那么该学习哪方面的知识?...
- 盘点Chrome 灵魂插件!爱了爱了!
- linux的基础知识——signal信号捕捉,信号集操作函数
- STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)
- 弹飞大爷 BZOJ4764 LCT维护内向基环树森林
- 解决Execution failed for task ':app:clean'. Unable to delete directory问题
- 刨根问底HTTP和WebSocket协议
- linux运行tomcat常见问题,linux – tomcat运行,但是8080端口没有响应
- QQ音乐系统API接口文档
- css字体倾斜角度_css如何设置字体倾斜样式
- 网页三剑客8免费下载加序列号
- https工作原理及CA证书及验证证书
- 关于富文本编辑器的图片处理
- 2021110701-java前后台传递时间对象相差8个小时的时区问题
- STM32使用的相关知识点
- 十二、Python简单数据结构应用(之…
- CBitmap Detach和DeleteObject的关系
- JAVA//JAVA基本程序设计架构
- VBA入门到进阶常用知识代码总结40
- 优步UBER司机全国各地奖励政策汇总 (4月4日-4月10日)