Android(Java)代码生成技术--JavaPoet初体验之手动实现依赖注入

本文介绍了如何使用JavaPoet在Android开发中实现编译期代码生成,通过自定义注解处理器和JavaPoet库,实现了类似ButterKnife的依赖注入功能。文章详细阐述了编译期代码生成的原理,以及如何定义和处理自定义注解,最终通过实例展示了如何在项目中应用这些技术。
摘要由CSDN通过智能技术生成

前言

相信大家在平常的开发中,依赖注入这个词没少听说过吧,比如做安卓开发的,使用的Butterknife、Greendao等等第三方库,都是使用的一种叫做编译期代码即时生成的技术,然后我们可以利用编译生成的类来辅助我们的开发,减少我们的工作量,这个技术听上去感觉挺高大上的,编译期间代码生成,这该怎么做到啊,好像从来没有从哪听说编译还能生成代码的,下面让我们来看看这门神奇的技术!

编译期代码生成原理

首先在这之前,我们可能或多或少了解到一个叫JavaPoet的技术,首先我们从它开始,我们来到它的源码,你会发现它好像并没有做什么高深的事情,总共才十几个类,而且大多数只是做了一些类的封装,提供一些接口方便使用,然后还提供了一个工具类供我们使用,如图,它的源码仅仅只有下面几个类而已
这里写图片描述
这时候就迷了,难道编译期生成代码不是这个库帮我们完成的吗?
准确的说确实不是的,那它的功能是什么呢?它其实只是完成了我们所说的一半的功能,就是代码生成,而且是简单易懂的代码生成,因为它做了封装,对一些常用的代码生成需求基本都提供了相应的方法,大大减少了代码复杂度。那和我们想要的需求来比,少了一个编译期间生成,那这个怎么做呢?

其实要实现编译期间做一些事情,这个工作Java已经帮我们做好了,我们先来看一个类AbstractProcessor,这个类可能平常不会用到,但是也没关系,我们简单了解一下它,首先你可以把它理解为一个抽象的注解处理器,它位于javax.annotation.processing.AbstractProcessor;下面,是用于在编译时扫描和处理注解的类,我们要实现类似ButterKnife这样的功能,首先定义一个自己的注解处理器,然后继承它即可,如下

public class MyProcessor extends AbstractProcessor{
    @Override
    public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
        return false;
    }
}

可以看到我们需要实现一个叫process的抽象方法,这个方法里的内容就会在编译期间执行。
然后,怎么让jvm在编译期间调用我们自己写的这个注解处理器呢,有一个快捷办法就是使用谷歌的开源库auto,然后使用它提供的AutoService注解来实现,另外一种办法就是自己手动去创建指定的文件夹,然后配置我们的注解处理器的路径。

做完上述工作后,在编译时,jvm就会扫描到所有的AbstractProcessor 的实现类,这里也就是MyProcessor ,然后调用实现实现类的process方法,执行相应的操作,然后我们生成代码的工作就可以写在process这里,然后具体的生成代码的方法再借助JavaPoet工具来简化操作。
因为我们生成代码的工具是在编译期间执行的,最后生成的java代码会和普通的java代码一起编译,当做普通的类来使用,所以不会影响到最后程序运行时的性能,最多只是编译速度慢了点&#

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值