java注释跳转方法,Java自定义注解实现Router跳转
简介
Android项目架构中,随着业务的复杂越来越大,模块化/组件化是必须的。对于Activity之间的跳转希望通过注解自动实现,模仿ARouter做法,实现简单路由组件。
思路
创建注解lib模块,自定义注解
创建注解编译处理lib模块,实现添加注解标识的类和注解的映射关系
创建公用跳转的Router工具类
实现
项目中创建自定义注解module,类型为Java Library,如lib_annotation.创建自定义注解IRouter,如下
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface IRouter {
// 注解参数
String path();
}
image.png
项目中创建注解编译module,类型为Java Library,如lib_compiler。创建继承自AbstractProcessor的处理类并且重写方法process。
lib_compiler模块的build.gradle添加依赖:
implementation 'com.squareup:javapoet:1.11.1' //一款可以自动生成Java文件的第三方依赖
implementation 'com.google.auto.service:auto-service:1.0-rc5' //自动在META-INF文件夹下生成Processor配置信息文件
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc5'
implementation project(":lib_annotation")
重写process方法
@AutoService(value = {Processor.class})
@SupportedAnnotationTypes(value = {"com.supcon.mes.lib_annotation.IRouter"})
@SupportedSourceVersion(value = SourceVersion.RELEASE_8)
public class IActivityProcess extends AbstractProcessor {
private Filer mFiler;
private static final String ROUTER_PACKAGE = "com.supcon.mes.router";
private static final String ROUTER_NAME = "Activity_Router_Mapper";
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
mFiler = processingEnv.getFiler();
}
@Override
public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
// 获取添加IRouter注解的所有类
Set extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(IRouter.class);
// 使用JavaPoet工具 创建注解映射类
TypeSpec.Builder builder = TypeSpec.classBuilder(ROUTER_NAME).addModifiers(PUBLIC);
for (Element annotatedElement : annotatedElements) {
// 获取注解参数path
String path = annotatedElement.getAnnotation(IRouter.class).path();
// 获取被注解的类名
String name = annotatedElement.getSimpleName().toString();
// 获取类名全称
TypeElement typeElement = (TypeElement) annotatedElement;
String className = typeElement.getQualifiedName().toString();
// 创建字段:以path为变量名,以类名为值
FieldSpec fieldSpec = FieldSpec.builder(String.class,path).addModifiers(PUBLIC).addModifiers(STATIC)
.initializer("$S",className).build();
// 将字段添加到类中
builder.addField(fieldSpec);
}
try {
// 创建Java文件
JavaFile javaFile = JavaFile.builder(ROUTER_PACKAGE,builder.build()).build();
javaFile.writeTo(mFiler);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
image.png
3.需要的模块引入依赖,rebuild后在相应的模块路径.../build/generated/source/apt/debug/com.supcon.mes.router/下,创建一个名为Activity_Router_Mapper的映射java文件
implementation project(":lib_annotation")
implementation project(":lib_compiler")
annotationProcessor project(":lib_compiler")
image.png
4.实现公用Router工具类
public class RouterHelper {
public static void goActivity(Context context,String path, Bundle extra){
Intent intent = new Intent(context,getActivity(path));
// intent.setClass(context,getActivity(path));
if (extra != null){
intent.putExtras(extra);
}
context.startActivity(intent);
}
private static Class> getActivity(String path) {
try {
Class> routerClass = Activity_Router_Mapper.class;
Field field = routerClass.getField(path);
return Class.forName(field.get(routerClass).toString());
} catch (NoSuchFieldException | ClassNotFoundException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
}
5.使用
@IRouter(path = Constant.Router.LOGIN)
public class LoginActivity extends AppCompatActivity {
// ...TODO
}
@IRouter(path = Constant.Router.SETTING)
public class SettingsActivity extends AppCompatActivity {
// ...TODO
}
RouterHelper.goActivity(LoginActivity.this,Constant.Router.SETTING,null);
java注释跳转方法,Java自定义注解实现Router跳转相关推荐
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
使用Java反射(Reflect).自定义注解(Customer Annotation)生成简单SQL语句 这次给大家介绍一下在Java开发过程中 使用自定义注解开发: 主要知识点: ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- java注释_全面解析Java中的注解与注释
注解一.什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一个特 ...
- java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用
Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...
- Java接口防刷策略(自定义注解实现)
前言 本文一定要看完,前部分为逻辑说明及简单实现,文章最后有最终版解决方案(基于lua脚本),因为前部分是防君子不防小人,无法抵挡for循环调用. 目的 短信发送及短信验证码校验接口防刷 一方面防止用 ...
- python注释_不建议使用Java注释的正确方法
python注释 几乎没有什么@Deprecated没有适当的文档看到@Deprecated方法更令人生气的了. 我感到失落. 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她添 ...
- java 注释 代码,如何在Java中注释代码块
Is it possible to annotate a block of code? E.g. for cycle or simply curly brackets? If so, how? Fir ...
- android url scheme 跳转传值,如何自定义 URL Scheme 进行跳转
一.URL Scheme 简介和作用 在 :// 之前的部分就称为 URL Scheme. 也就是说 http://www.jianshu.com/ 的 URL Scheme 就是 http . 更多 ...
- java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解
一:自定义score的应用场景 先打个比方,比如新产品上架了,我想让最新上架的产品搜索时候,排在前面,怎么办呢?很简单按时间排序.嗯这种方法很好实现. 但下面又有个需求,比如我要求排序中上架时间的比重 ...
最新文章
- SCI-HUB客户端(文献神器V6.0)——下载文献如此简单
- 计算机基础及msoffice应用书本,全国计算机等级考试一本通一级计算机基础及MSOffice应用2016年无纸化考试专用...
- 升职加薪必看!如何试出一个Java开发者真正的水平
- 重新理解 Monad
- POJ2669不错的最大流 竞赛问题(枚举King的个数)
- [转] SQL的3种连接查询
- 正态分布为什么常见?
- flink和kafka区别_Apache Flink和Kafka入门
- Typecho安装后后台界面和文章链接均为404错误的解决方法
- 喜庆:上周阅读量5W,超过了99%的C友
- python贪心算法几个经典例子_Python笔试——贪心算法
- 细说IIR滤波器和FIR滤波器的区别
- SSM项目实战之博客系统
- 苹果雪豹操作系统正式版_别着急更新!苹果 iOS 14 正式版导致部分游戏崩溃
- 腾讯视频QLV格式转换mp4的方法
- 实现连续签到案例的可能(使用)
- 树莓派python实现http请求控制海康威视摄像头转动
- Lab1实验过程及心得体会
- apache-Tomcat 8.5.39安装包 安装过程以及启动文件详解
- python自动化 html 翻译转 pdf
热门文章
- 虚拟机上安装 Red Hat Enterprise Linux 7 64位
- Nginx禁止通过IP,未绑定域名访问服务器
- Silverlight 和WPF的Composite Guidance(Prism V2)发布了
- QQ 邮箱的换肤 bug
- Firefox 的一个HTTP分析器扩展
- linux bash shell 判断变量是否在列表中
- linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
- linux 内核参数somaxconn TCP监听队列长度
- linux docker 容器运行后不退出的方法
- CPA、CPS、CPM、CPT、CPC 是什么