简介

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跳转相关推荐

  1. 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句

    使用Java反射(Reflect).自定义注解(Customer Annotation)生成简单SQL语句 这次给大家介绍一下在Java开发过程中 使用自定义注解开发: 主要知识点:          ...

  2. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  3. java注释_全面解析Java中的注解与注释

    注解一.什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一个特 ...

  4. java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用

    Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...

  5. Java接口防刷策略(自定义注解实现)

    前言 本文一定要看完,前部分为逻辑说明及简单实现,文章最后有最终版解决方案(基于lua脚本),因为前部分是防君子不防小人,无法抵挡for循环调用. 目的 短信发送及短信验证码校验接口防刷 一方面防止用 ...

  6. python注释_不建议使用Java注释的正确方法

    python注释 几乎没有什么@Deprecated没有适当的文档看到@Deprecated方法更令人生气的了. 我感到失落. 我应该仍然使用该方法吗? 可能这不是开发人员的意图,这就是为什么他/她添 ...

  7. java 注释 代码,如何在Java中注释代码块

    Is it possible to annotate a block of code? E.g. for cycle or simply curly brackets? If so, how? Fir ...

  8. android url scheme 跳转传值,如何自定义 URL Scheme 进行跳转

    一.URL Scheme 简介和作用 在 :// 之前的部分就称为 URL Scheme. 也就是说 http://www.jianshu.com/ 的 URL Scheme 就是 http . 更多 ...

  9. java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解

    一:自定义score的应用场景 先打个比方,比如新产品上架了,我想让最新上架的产品搜索时候,排在前面,怎么办呢?很简单按时间排序.嗯这种方法很好实现. 但下面又有个需求,比如我要求排序中上架时间的比重 ...

最新文章

  1. SCI-HUB客户端(文献神器V6.0)——下载文献如此简单
  2. 计算机基础及msoffice应用书本,全国计算机等级考试一本通一级计算机基础及MSOffice应用2016年无纸化考试专用...
  3. 升职加薪必看!如何试出一个Java开发者真正的水平
  4. 重新理解 Monad
  5. POJ2669不错的最大流 竞赛问题(枚举King的个数)
  6. [转] SQL的3种连接查询
  7. 正态分布为什么常见?
  8. flink和kafka区别_Apache Flink和Kafka入门
  9. Typecho安装后后台界面和文章链接均为404错误的解决方法
  10. 喜庆:上周阅读量5W,超过了99%的C友
  11. python贪心算法几个经典例子_Python笔试——贪心算法
  12. 细说IIR滤波器和FIR滤波器的区别
  13. SSM项目实战之博客系统
  14. 苹果雪豹操作系统正式版_别着急更新!苹果 iOS 14 正式版导致部分游戏崩溃
  15. 腾讯视频QLV格式转换mp4的方法
  16. 实现连续签到案例的可能(使用)
  17. 树莓派python实现http请求控制海康威视摄像头转动
  18. Lab1实验过程及心得体会
  19. apache-Tomcat 8.5.39安装包 安装过程以及启动文件详解
  20. python自动化 html 翻译转 pdf

热门文章

  1. 虚拟机上安装 Red Hat Enterprise Linux 7 64位
  2. Nginx禁止通过IP,未绑定域名访问服务器
  3. Silverlight 和WPF的Composite Guidance(Prism V2)发布了
  4. QQ 邮箱的换肤 bug
  5. Firefox 的一个HTTP分析器扩展
  6. linux bash shell 判断变量是否在列表中
  7. linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
  8. linux 内核参数somaxconn TCP监听队列长度
  9. linux docker 容器运行后不退出的方法
  10. CPA、CPS、CPM、CPT、CPC 是什么