android组件化 APT高级用法javaPoet

Android组件化实战五: APT的高级用法JavaPoet 前言 上一篇文章简单介绍了APT及其使用,生成相应的java文件,帮我们执行相关的操作,生成java文件的方式是字符串拼接的方式,但是如果要生成的java文件成员属性和方法比较多,这种方式就比较麻烦了,而且容易出现人为失误。所有就有了API调用的方式生成java文件,也就是JavaPoet。 什么是JavaPoet 项目主页及源码:https://github.com/square/javapoet APT + JavaPoet = 超级利刃 JavaPoet是square推出的开源java代码生成框架,提 阅读详情

什么是JavaPoet,就是APT+javaPoet =超级利刃

javaPoet是square公司推出的开源代码生成框架,提供api生成.java 源文件,这个框架功能非常实用,也是我们习惯的面向对象oop思想 可以很方便的使用它根据注解生成代码 通过这种自动化生成代码的方式  可以让我们更加简洁优雅的方式来替代复杂的工作

它的github地址 javaPoet

它的官网有很多例子 可以跟着写

javaPoet和前一篇博客生成文件的顺序不一样,javaPoet是倒着来的

javaPoet常用的8个类

这些写多了就记住了

javaPoet字符串格式化规则

 

新建一个项目JavaPoetTest 二个library 一个是annotation  一个是compiler

跟上篇博客配置是一样的,这就不再说了,直接看下process()方法,看下javaPoet github地址 它有demo,先把demo练习几篇就会了

比如要创建这个类

package com.example.helloworld;

public final class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, JavaPoet!");
  }
}

官网给的代码

 @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        if(set.isEmpty()){
            return false;
        }

        messager.printMessage(Diagnostic.Kind.NOTE, "1111111");
        MethodSpec main = MethodSpec.methodBuilder("main")//main是方法名
                .addModifiers(Modifier.PUBLIC, Modifier.STATIC)//添加方法修饰符
                .returns(void.class)//方法返回值
                .addParameter(String[].class, "args")//行参类型和行参变量名字
                .addStatement("$T.out.println($S)", System.class, "Hello, JavaPoet!")//这是方法里面的内容 $T $s表示类和字符串 跟String.format("%d几岁",%d)跟String的格式一样
                .build();
        //这是添加类信息
        TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")//添加类名字
                .addModifiers(Modifier.PUBLIC, Modifier.FINAL)//类修饰符
                .addMethod(main)//添加类方法
                .build();
        //这是把该类放到对应的包中
        JavaFile javaFile = JavaFile.builder("com.example.helloworld", helloWorld)
                .build();
        messager.printMessage(Diagnostic.Kind.NOTE, "22222");
        //写到控制台 方便查看
        try {
            javaFile.writeTo(System.out);
        } catch (IOException e) {

            e.printStackTrace();
        }
        try {
            //这个必须得调用 不然生不了文件
            javaFile.writeTo(filer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

然后make module app下就行了,看下build控制台

再看下app. module下的build目录下查看生成的文件

现在再来写我们自己写的ARouter注解处理器要生成的文件,如下

public class MainActivity$$ARouter {
  public static Class findTargetClass(String path) {
    return path.equals("/app/MainActivity") ? MainActivity.class : null;
  }
}

process()方法中的代码

 @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        if(set.isEmpty()){
            return false;
        }
        // 获取所有带ARouter注解的 类节点
        Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);
        // 遍历所有类节点
        for (Element element : elements) {
            // 通过类节点获取包节点(全路径:com.netease.xxx)
            String packageName = elementUtils.getPackageOf(element).getQualifiedName().toString();
            messager.printMessage(Diagnostic.Kind.NOTE, "packageName="+packageName);
            // 获取简单类名
            String className = element.getSimpleName().toString();
            messager.printMessage(Diagnostic.Kind.NOTE, "className="+className);

//            messager.printMessage(Diagnostic.Kind.NOTE, "被注解的类有:" + className);
            // 最终想生成的类文件名
            String finalClassName = className + "$$ARouter";

            // 高级写法,javapoet构建工具,参考(https://github.com/JakeWharton/butterknife)
            try {
                // 获取类之上@ARouter注解的path值
                ARouter aRouter = element.getAnnotation(ARouter.class);

                // 构建方法体
                MethodSpec method = MethodSpec.methodBuilder("findTargetClass") // 方法名
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
                        .returns(Class.class) // 返回值Class<?>
                        .addParameter(String.class, "path") // 参数(String path)
                        // 方法内容拼接:
                        // return path.equals("/app/MainActivity") ? MainActivity.class : null
                        .addStatement("return path.equals($S) ? $T.class : null",
                                aRouter.path(), ClassName.get((TypeElement) element))
                        .build(); // 构建

                // 构建类
                TypeSpec type = TypeSpec.classBuilder(finalClassName)
                        .addModifiers(Modifier.PUBLIC) //, Modifier.FINAL)
                        .addMethod(method) // 添加方法体
                        .build(); // 构建

                // 在指定的包名下,生成Java类文件
                JavaFile javaFile = JavaFile.builder(packageName, type)
                        .build();
                javaFile.writeTo(System.out);
                javaFile.writeTo(filer);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return true;
    }

ok,

 

Android组件化实战六:路由架构设计 前言 结合前面的模块之间的交互,主要分析了类加载、全局Map记录(跳转目标Class)两种交互方式,以及APT和JavaPoet技术生成类文件,本文分析组件化的路由架构,我们到底需要通过APT和JavaPoet生成什么样的类文件呢? 组件化路由架构设计 先来看这样一幅架构设计图,组文件记录是一对一的即一个子模块对应一个组文件记录,而一个组文件记录对应多个路径文件记录,第二点比较好理解,因为各个子模块有多个Activity,对应多个路径信息。对应第一点,为什么要生成一对一的组(名)文件记录呢?试想一下,如果 阅读详情

相关推荐

Android代码生成技术JavaPoet的使用

一个简单的了解编译期代码生成原理的demo,涉及到了javaPoet技术、自定义注解等,可用来了解butterknife、greenDao的原理

android架构师之路——APT和 Javapoet 实现Butterknife

介绍 APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解。注解处理器以Java代码(或者编译过的字节码)作为输入,生成.java文件作为输出。 使用APT的优点就是方便、简单,可以少些很多重复的代码。 用过ButterKnife、Dagger、EventBus等注解框架的同学就能感受...

zkq49099的专栏 480

python 写一个简单的 telegram bot (电报机器人)

replit.com 环境配置太恶心了,只能使用 poetry.poetry 这个名字是挺好听,用起来也是很垃圾,太恶心。heroku.com 注册登录不方便,需要各种验证。所以,部署的问题,目前搁置。

waterHBO的博客 3192

一个使用 APT+字节码插桩优化代码设计的 Android Demo

本篇文章,采用一个 Demo 的形式,来阐述 APT 和字节码插桩的使用方式,以及如何用之来优化代码设计。 一. Demo 的引入 1.1 需求描述 假设当前有这么一种场景,我们有一个展示各种 Card 的应用,有只在国内展示的 CNACard、CNBCard 等,有只在国外展示的 ExpACard、ExpBCard 等,也有不管国内外都要展示的 ACard、BCard 等。 1.2 简单的代码结构设计 首先设计出各个 Card,且都实现同一个接口 ICard: public interface ICard

Eqiqi的博客 595

Deeplabcut实战:从数据标注到行为分析的全流程解析

本文详细解析了Deeplabcut从数据标注到行为分析的全流程实战技巧,包括项目创建、配置文件定制、智能帧提取、高效标注方法、模型训练优化以及多视角融合等高级应用。通过具体案例和实用参数配置,帮助研究者快速掌握这一行为分析工具,提升实验效率和准确性。

weixin_29057163的博客 245

uni-app刮奖

uni-app的刮奖效果,要注意的点: 1.小程序的canvas层级问题(可用cover-view规避) 2.不能操作dom 以下是uni-app刮奖效果的代码: <template> <!-- 刮奖 --> <view v-else class="scratch"> <view class="box"> &lt...

qq_40101922的博客 4306

android项目代码简化,Android 中使用 APT 简化代码

前言APT(Annotation Processor Tool)是用来处理注解的,即注解处理器。APT 在编译器会扫描处理源代码中的注解,我们可以使用这些注解,然后利用 APT 自动生成 Java 代码,减少模板代码,提升编码效率,使源码更加简洁,可读性更高。1、具体场景下面我将会以项目中常见的 intent 页面跳转为例,给大家演示一下,如何自动生成 intent 代码,以及对 getInten...

weixin_35793018的博客 302

帝企鹅优化器(EPO)详解:从基础原理到代码实战

帝企鹅优化器(EPO)是受帝企鹅群体在极寒环境中抱团取暖行为启发,于2018年提出的一种群体智能优化算法。其核心机制是模拟帝企鹅种群通过动态调整位置来维持体温的过程,主要包括确定集群边界、计算温度分布、衡量个体间距离以及更新位置四个步骤,从而在求解复杂优化问题时有效平衡全局探索与局部开发。该算法具有参数少、结构清晰、易于实现等优点,在工程优化、图像处理、机器学习特征选择以及冷链物流车辆路径规划等领域展现出良好的应用潜力。

qq_42212808的博客 138

Android AOP 之 javapoet (APT)示例

APTDemo 这里主要介绍AOP编程之javapoet框架,javapoet框架也叫注解处理框架,必须依赖于注解; 一、准备工作: 1、新建两个javaModule(可以先建两个正常的android Library项目),一个用来存放注解,一个用来存放注解处理器,如下图: 需要注意的是这里要把android Library改成java,所以要把两个Module的gradle配置文件改成...

vv765947965的博客 1739

嵌入式数字信号处理器(DSP)高频面试题及参考答案

数字信号处理器(DSP)是一种专门设计用于执行数字信号处理任务的微处理器。它具有高度优化的架构,能够高效地执行复杂的数学运算,如快速傅里叶变换(FFT)、卷积、滤波和其他信号处理算法。DSP通常具有高速的中央处理器、专用的硬件乘法器、累加器、硬件循环支持和高速的内存访问能力,以满足实时信号处理的需求。通信:用于调制解调、语音编码、数据压缩、加密和解密。音频处理:如音乐合成、音效增强、语音识别和语音合成。视频和图像处理:包括图像压缩、视频编码、图像增强和模式识别。生物医学工程。

大模型大数据攻城狮的专栏 5266

Claude Code Skills 入门:内置技能与自定义技能开发

│ Skill 的特点 │1. 封装性:把复杂操作封装成简单命令2. 可复用:一次定义,随处使用3. 可定制:支持参数传入4. 可发现:通过 /skill-name 方式调用打个比方,如果说 Claude Code 的基础工具是「原材料」,那 Skills 就是「预制菜」——只需要简单加热(调用),就能得到成品(结果)。你可以创建自己的 Skill 来封装常用操作。Skill 支持参数,通过。

gaoxiang_120的专栏 670

android注解之APT和javapoet

JavaPoet是square推出的开源java代码生成框架,提供Java Api生成.java源文件,这个框架功能非常实用,也是我们习惯的Java面向对象OOP语法, 可以很方便的使用它根据注解生成对应代码。通过这种自动化生成代码的方式, 可以让我们用更加简洁优雅的方式要替代繁琐冗杂的重复工作。关于APT和JavaPoet的使用就讲完了,利用这个技术,我们可以实现很多强大的功能。

袁震的博客 1668

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

Android架构师-组件化-组件化APT高级用法JavaPoet 5

一:什么是JavaPoet 1:定义 项目主页及源码:https://github.com/square/javapoet 对我们前一章的内容做了一个封装,实现过程稍微有点不一样, 传统的写法:从包名--》类---》属性--》方法 正序 JavaPoet:方法--》属性---》类---》包 倒序 2:依赖JavaPoet库 使用JavaPoet有Retrofit和...

u013815832的博客 336

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1511

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

组件化二、APT+JavaPoet配合搭建组件化架构

1、APT(注解处理器)介绍 APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解主动生成代码,如果想要自定义注解处理器能够正常运行,必须要通过APT工具来进行处理。 也可以这样理解,只有通过申明APT工具后,程序在编译期间自定义注解处理器才能执行 通过来讲:根据规则,帮我们自动生成代码,生成类文件 Google提供了APT的库(Java库),后面会介绍如何导入使用 2、Element程序元素 Package

Silicon_Valley 528

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

APT及JavaPoet基本使用

本文来自享学derry老师的课堂分享 APT初窥 APT是什么? APT(Annotation Processing Tool) 是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解自动生成代码,如果想要自定义的注解处理器能够正常运行,必须要通过APT工具来进行处理。也可以这样理解,只有通过声明APT工具后,程序在编译期间自定义注解解释器才能执行。 通俗理解:根据规则,帮我们生成代码、生成类文件 APT中用到的重要元素 PackageEl

czZ__czZ的博客 809

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

组件化的架构设计(一):gradle组件化配置、APT+javapoet介绍和使用

博客主页 参考: Gradle核心(五):Gradle高级自定义 gradle组件化配置 Android组件化开发的配置,离不开gradle构建工具,它的出现让工程有无限的可能。gradle核心是基于groovy脚本语言,groovy脚本基于java且扩展了java,所以gradle需要依赖JDK和Groovy库。 gradle简单介绍 gradle语法:从gradle的日志输出开始...

weixin_35582019的博客 1168

【Android组件化】javaPoet的使用

基础知识回顾 【Android组件化】一文教你玩转APT_我想月薪过万的博客-优快云博客https://blog.youkuaiyun.com/qq_41885673/article/details/122818568?spm=1001.2014.3001.5501 javaPoet使用教程 square/javapoet: A Java API for generating .java source files. (github.com)https://github.com/square/javapoet .

我想月薪过万的博客 763

【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )

一、注解节点类型、 二、JavaPoet 简介、 三、注解处理器中使用 JavaPoet 生成代码、 四、路由框架说明、 五、博客资源、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1630

【Android】从零搭建组件化项目

什么是组件化?组件化是什么?组件化在Android上应该如何去使用?关于这些问题,你真的了解吗?

宾有为的博客 1179

Android组件化设计2 --- 自定义注解处理器(APT)

APT 注解处理工具

qq_33235287的博客 2031

【Android组件化】一文教你玩转APT

APT(Annotation Processing Tool)

我想月薪过万的博客 2878

2024年组件化开发和JavaPoet倒序生成方法、类、包代码,java面试题大汇总

这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.youkuaiyun.com/forums/4f45ff00ff254613a03fab5e56a57acb)收录**需要这份系统化的资料的朋友,可以点击这里获取。

2301_76348206的博客 284

android 路由总线,利用APT实现android路由框架一

随着业务的发展,项目会越来越大,实现组件化便于更好的维护项目以及拆分。3.png业务组件相互独立,需要路由来完成之间的跳转与数据传递。实现方法:1、 使用 EventBus的方式,缺点是:EventBean维护成本太高,不好去管理:2、 使用广播的方式,缺点是:不好管理,都统一发出去了3、 使用隐士意图方式,缺点是:在AndroidManifest.xml里面配置xml写的太多了4、 使用类加载方...

weixin_32473663的博客 257

android开发package组件,Android组件化开发

组件化设置config.gradle(组件化统一配置文件)image-config.png不熟悉groovy语法的可以简单了解下image-module.png这里记得在项目根目录的build.gradle中添加配置文件config.gradle否则在项目中无法引用config.gradle中定义的属性module中build.gradle配置/***isRelease是config.gradle...

weixin_39662594的博客 431
上一篇: Android组件化APT使用与介绍
下一篇: Kotlin入门简介
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值