【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

简介: 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )

文章目录

一、设置支持的注解类型

二、注解处理器中打印日志

三、主应用中使用注解

四、注解处理器 获取注解节点

五、博客资源



组件化系列博客 :


【Android 组件化】从模块化到组件化

【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )

【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )

【Android 组件化】路由组件 ( 路由组件结构 )

【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )


在 【Android 组件化】路由组件 ( 路由组件结构 ) 博客中介绍了组件化中的 " 路由组件 " , 分为 " 自定义注解模块 " , " 注解处理器模块 " , " 依赖库模块 " 3 33 个模块 ;


本篇博客中讲解 " 注解处理器 " 开发 ;






一、设置支持的注解类型


在 注解处理器 类上使用 @SupportedAnnotationTypes({}) 注解 , 为该 注解处理器 配置支持的注解 , 在大括号中输入 注解的完整 " 包名.类名 " 字符串 , 多个注解名称之间使用逗号 , 隔开 ;


@SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"})
public class RouterProcessor extends AbstractProcessor {
}



也可以在 getSupportedAnnotationTypes 函数中设置支持的注解类型 ;


 

/**
     * 指明注解处理器可以处理哪些注解
     *
     * @return 字符串类型 Set 集合
     */
    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return super.getSupportedAnnotationTypes();
    }



上述两种方法二选一 ;






二、注解处理器中打印日志


注解处理器 中 , 使用 javax.annotation.processing.Messager 打印数据 , 在 init 方法中 , 通过调用 ProcessingEnvironment processingEnvironment 参数的 getMessager 方法 , 获取 Messager 对象 ;



调用 Messager 对象的 printMessage 方法 , 打印日志 , 传入第 1 11 个参数是日志级别 , 一般设置成 Diagnostic.Kind.NOTE 参数 , 第二个参数是要打印的字符串 ;



打印结果输出到 Build 面板中 ;


image.png



代码示例 :


public class RouterProcessor extends AbstractProcessor {
    /**
     * 注解处理器中使用 Messager 对象打印日志
     */
    private Messager mMessager;
    /**
     * 该函数在初始化时调用 , 相当于构造函数
     * @param processingEnvironment
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        // 获取打印日志接口
        mMessager = processingEnvironment.getMessager();
        mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");
    }
}





三、主应用中使用注解


在主应用的 build.gradle 构建脚本中 , 引入注解处理器 与 注解类 依赖 ,


dependencies {
    // 引入注解处理器
    annotationProcessor project(':router-compiler')
    // 引入注解
    implementation project(':router-annotation')
}


Java 类中使用 Route 注解 ;


package kim.hsl.component;
import android.app.Activity;
import android.os.Bundle;
import androidx.annotation.Nullable;
import kim.hsl.router_annotation.Route;
@Route(path = "app/MainActivity")
public class MainActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}





四、注解处理器 获取注解节点


使用 @Route 注解的节点都是类 , 因此注解节点的类型都是 TypeElement 类型 ;


编译时 , 注解处理器会自动获取使用了 @Route 注解的节点 , 在 注解处理器 的 process 方法中 , 可以获取到这些使用了注解的 TypeElement 节点 ;


package kim.hsl.router_compiler;
import com.google.auto.service.AutoService;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
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.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
// 自动注册注解处理器
@AutoService(Processor.class)
// 支持的注解类型
@SupportedAnnotationTypes({"kim.hsl.router_annotation.Route"})
// 支持的 Java 版本
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class RouterProcessor extends AbstractProcessor {
    /**
     * 注解处理器中使用 Messager 对象打印日志
     */
    private Messager mMessager;
    /**
     * 该函数在初始化时调用 , 相当于构造函数
     * @param processingEnvironment
     */
    @Override
    public synchronized void init(ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        // 获取打印日志接口
        mMessager = processingEnvironment.getMessager();
        mMessager.printMessage(Diagnostic.Kind.NOTE, "Messager Print Log");
    }
    /**
     * 该函数在注解处理器注册时自动执行, 是处理注解的核心函数
     *
     * Set<? extends TypeElement> set 参数 : 该集合表示使用了相关注解的节点的集合
     *
     * @param set
     * @param roundEnvironment
     * @return
     */
    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        for (TypeElement typeElement: set){
            mMessager.printMessage(Diagnostic.Kind.NOTE, "SupportedAnnotationTypes : " + typeElement.getQualifiedName());
        }
        return false;
    }
}




在编译时 , 在 " Build " 面板中的 " Build Output " 模块中 , 输出 注解处理器 使用 Messager 打印的日志 ;


打印的内容是检测到的在 Android 应用中所有使用到的 " kim.hsl.router_annotation.Route" 类型注解的节点 ;


在主应用中使用了 @Route(path = "app/MainActivity") 节点修饰了 MainActivity , 使用了一次该注解 , 因此在 注解处理器 的 process 方法中 , 可以获取到该注解信息 ;


在 Java 代码中使用了多少次 @Route 注解 , 则在 注解处理器 的 process 方法中就可以获取到对应次数的 注解节点 ;



编译时输出的日志内容 :


注: Messager Print Log
注: SupportedAnnotationTypes : kim.hsl.router_annotation.Route


image.png





五、博客资源


博客源码 :


GitHub : https://github.com/han1202012/Component

CSDN 下载 :


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
存储 移动开发 ARouter
Android组件化开发,从未如此简单
组件化方式的开发,有很多的文章去阐述,而本篇的特点,在于有实际的组件化实战代码,有开源的组件化Demo样例,重在浅显易懂,重在能够应用于实际业务,也重在简单。
679 0
|
编解码 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)1
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
1177 1
|
11月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
778 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
编解码 开发工具 Android开发
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)2
1065 2
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
205 3
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
350 2
|
Android开发
Android 修改盒子路由方式 Static / DHCP
Android 修改盒子路由方式 Static / DHCP
220 2
|
Android开发
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
|
移动开发 ARouter 前端开发
|
存储 设计模式 ARouter
现代化 Android 开发:组件化与模块化的抉择
本文为现代化 Android 开发系列文章第四篇。
417 0

热门文章

最新文章