IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 插件注解处理器工程创建 -> 正文阅读

[移动开发]插件注解处理器工程创建

注解工程建立

  1. 创建 router-annotations 文件夹,并在文件夹下新建 build.gradle,配置信息如下

    
    // 应用java 插件
    apply plugin: 'java'
    
    // 设置jdk 版本
    targetCompatibility = JavaVersion.VERSION_1_7
    sourceCompatibility = JavaVersion.VERSION_1_7
    
  2. 在工程 settings.gradle 配置注解工程

    include ':app'
    include ':router-annotations'
    rootProject.name = "pluginPro"
    
  3. 创建自定义注解类 Destination

    // 说明注解可以修饰的元素,表示该注解可以用于标记在类上
    @Target(ElementType.TYPE)
    // 说明当前注解可以被保留的时间
    @Retention(RetentionPolicy.CLASS)
    public @interface Destination {
        // 当前页面的URL
        String url();
    
        // 当前页面的描述
        String description();
    }
    
    

在这里插入图片描述

使用注解工程

  1. 在主工程 build.gradle 中引入注解工程

    dependencies {
    	implementation project(':router-annotations')
    }
    
  2. 添加自定义注解

    @Destination(
            url = "router://page-main",
            description = "首页"
    )
    public class MainActivity extends AppCompatActivity {
    

创建注解处理器工程

  • 新建注解处理器工程 router-processor,新建 build.gradle,添加配置信息

    
    // 应用java 插件
    apply plugin: 'java'
    
    // 设置jdk 版本
    targetCompatibility = JavaVersion.VERSION_1_7
    sourceCompatibility = JavaVersion.VERSION_1_7
    
    dependencies {
        implementation project(':router-annotations')
    }
    	
    
  • 在工程 settings.gradle 添加注解处理器工程

    include ':app'
    include ':router-annotations'
    include ':router-processor'
    rootProject.name = "pluginPro"
    
  • 新建注解处理器类 DestinationProcessor ,在 boolean process() 中编写业务逻辑
    在这里插入图片描述

  • 生成类-类信息拼接

     @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
    
        // 避免多次调用 process
        if(roundEnvironment.processingOver()){
            return false;
        }
    
    
        System.out.println(TAG+" >>> process start...");
    
        // 获取所有标记了 @Destination 注解的类信息
        Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(Destination.class);
    
        System.out.println(TAG + " >>> all Destination elements count = "+ elements.size());
    
        // 当未搜集到 @Destination 注解的时候,跳过后续流程
        if (elements.size() <1 ){
            return false;
        }
    
        // 将要自动生成的类的类名
        String className  = "RouterMapping_" + System.currentTimeMillis();
        StringBuilder builder = new StringBuilder();
    
        builder.append("package com.imooc.router.mapping;\n\n");
        builder.append("import java.util.HashMap;\n");
        builder.append("import java.util.Map;\n");
        builder.append("public class ").append(className).append("  {\n\n");
        builder.append("    public static Map<String,String> get() {\n\n");
        builder.append("        Map<String,String> mapping = new HashMap<>();\n");
    
    
        // 遍历所有 @Destination 注解信息
        for (Element element : elements) {
            final TypeElement typeElement = (TypeElement) element;
    
            // 获取添加了注解类的信息
            Destination annotation = typeElement.getAnnotation(Destination.class);
    
            if (annotation==null) continue;
    
            // 获取添加的注解信息
            String url = annotation.url();
            String description = annotation.description();
            String realPath  = typeElement.getQualifiedName().toString(); // 获取添加注解的类名
            System.out.println(TAG +" >>> url = "+ url);
            System.out.println(TAG +" >>> description = "+ description);
            System.out.println(TAG +" >>> realPath = "+ realPath);
    
            builder.append("        ")
                    .append("mapping.put(")
                    .append("\""+url+"\"")
                    .append(",")
                    .append("\""+realPath+"\"")
                    .append(");\n");
        }
    
        builder.append("        return mapping;\n");
        builder.append("    }");
        builder.append("}\n");
    
        String mappingFullClassName = "com.imooc.router.mapping."+className;
    
        System.out.println(TAG + " >>> mappingFullClassName = "+mappingFullClassName);
    
        System.out.println(TAG + " >>> class content = \n" + builder);
    
        // 写入自动生成的类到本地文件中
        try{
            JavaFileObject sourceFile = processingEnv.getFiler()
                    .createSourceFile(mappingFullClassName);
            Writer writer = sourceFile.openWriter();
            writer.write(builder.toString());
            writer.flush();
            writer.close();
        }catch (Exception ex){
            throw new RuntimeException("Error while create file",ex);
        }
    
        System.out.println(TAG + " >>> process finish.");
    
        return false;
    }
    
    
  • 添加插件注册service依赖

    注解处理器工程 build.gradle

    dependencies {
        implementation project(':router-annotations')
        implementation 'com.google.auto.service:auto-service:1.0-rc6'
        annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
    }
    
  • 注册注解处理器

    @AutoService(Processor.class)
    public class DestinationProcessor extends AbstractProcessor {
    

使用注解处理器

  • 主工程 build.gradle 引入注解处理器工程

        implementation project(':router-annotations')
        annotationProcessor project(':router-processor')
    
  • 为需要的类添加注解

    @Destination(
        url = "router://page-main",
        description = "首页"
    )
    public class MainActivity extends AppCompatActivity {
    

发布注解处理器插件

  • 在跟工程 gradle.properties 中配置要提交maven的信息

    POM_URL=../repo
    GROUP_ID = com.imooc.router
    VERSION_NAME = 1.0.0
    
  • 在 router-annotations 和 router-processor 项目各自新建gradle.properties,配置 POM_ARTIFACT_ID 信息

    POM_ARTIFACT_ID = router-annotations
    POM_ARTIFACT_ID = router-processor
    
  • 跟工程新建 maven-publish.gradle ,用于将插件发布到 maven 仓库

    
    apply plugin: 'maven'
    
    // 读取公共配置信息
    Properties gradleProperties = new Properties()
    gradleProperties.load(project.rootProject.file('gradle.properties').newDataInputStream())
    
    def VERSION_NAME = gradleProperties.getProperty('VERSION_NAME')
    def POM_URL = gradleProperties.getProperty('POM_URL')
    def GROUP_ID = gradleProperties.getProperty('GROUP_ID')
    
    // 读取项目配置的 POM_ARTIFACT_ID 信息
    Properties gradleProperties2 = new Properties()
    gradleProperties2.load(project.file('gradle.properties').newDataInputStream())
    
    def POM_ARTIFACT_ID = gradleProperties2.getProperty('POM_ARTIFACT_ID')
    
    println "maven-publish VERSION_NAME = $VERSION_NAME"
    println "maven-publish POM_URL = $POM_URL"
    println "maven-publish GROUP_ID = $GROUP_ID"
    println "maven-publish POM_ARTIFACT_ID = $POM_ARTIFACT_ID"
    
    
    uploadArchives {
        repositories {
            mavenDeployer {
                // 填入发布的信息
                repository(url: uri(POM_URL)) {
                    pom.groupId = GROUP_ID
                    pom.artifactId = POM_ARTIFACT_ID
                    pom.version = VERSION_NAME
                }
                // 处理对工程中对其他工程的引用
                pom.whenConfigured {pom ->
                    pom.dependencies.forEach {dep->
                        if(dep.getVersion() == "unspecified") {
                            dep.setGroup(GROUP_ID)
                            dep.setVersion(VERSION_NAME)
                        }
                    }
                }
            }
        }
    }
    
  • 在 router-annotations 和 router-processor 的 build.gradle 引入 maven-publish.gradle 插件

    apply from : rootProject.file('maven-publish.gradle')
    
  • 执行maven发布命令

    gradle :router-annotations:uploadArchives
    gradle :router-processor:uploadArchives
    

在这里插入图片描述

应用注解处理器插件

在主工程 build.gradle 引入注解插件的maven 地址,然后就可以应用注解了。

    implementation 'com.imooc.router:router-annotations:1.0.0'
    annotationProcessor 'com.imooc.router:router-processor:1.0.0'
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:51:20  更:2022-02-05 21:51:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:12:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码