博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java注释跳转方法,Java自定义注解实现Router跳转
阅读量:4507 次
发布时间:2019-06-08

本文共 3541 字,大约阅读时间需要 11 分钟。

简介

Android项目架构中,随着业务的复杂越来越大,模块化/组件化是必须的。对于Activity之间的跳转希望通过注解自动实现,模仿ARouter做法,实现简单路由组件。

思路

创建注解lib模块,自定义注解

创建注解编译处理lib模块,实现添加注解标识的类和注解的映射关系

创建公用跳转的Router工具类

实现

项目中创建自定义注解module,类型为Java Library,如lib_annotation.创建自定义注解IRouter,如下

@Retention(RetentionPolicy.CLASS)

@Target(ElementType.TYPE)

public @interface IRouter {

// 注解参数

String path();

}

8558e9ae5dfe

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;

}

}

8558e9ae5dfe

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")

8558e9ae5dfe

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);

转载地址:http://xhats.baihongyu.com/

你可能感兴趣的文章
suggestion开发小结以及 对键盘事件的总结(针对中文输入法状态)
查看>>
Nio Client
查看>>
数据库 chapter 16 XML数据库
查看>>
spring mvc jsp运行不起来的问题
查看>>
大数据概述
查看>>
SpringBoot 密码MD5加密
查看>>
Mac MySQL启动不了解决办法(MySQL卸载重新安装教程)
查看>>
连通块
查看>>
servlet.txt笔记
查看>>
jquery设置select选中
查看>>
今天说一下DML触发器的顺序
查看>>
Memcached学习(一)--网络模型
查看>>
FragmentTransaction add 和 replace 区别 转
查看>>
jQuery 效果方法
查看>>
STM32物联网通信WIFI
查看>>
java反射案例详解
查看>>
MAGENTO 与 reindexer
查看>>
数字,字符串,列表及其内置方法
查看>>
iOS遍历数组的同时删除元素
查看>>
小强的HTML5移动开发之路(16)——神奇的拖放功能
查看>>