Java注解系列之3rd

16 篇文章 0 订阅
6 篇文章 1 订阅

只有你尽力了 才有资格说运气不好
否则你所受的痛苦都是罪有应得
如何知道自己是否真的尽力?嗯,这是个问题…

接着前面的两篇文章来讨论:

注解解释器(Annotation Processor) 负责 处理 注解, 那 又是WHO 让注解解释器起作用的呢?要想回答这个问题,我们首先来看一下业界标杆是怎么做的。

1. EventBus VS ButterKnife

对于Android开发者而言,EventBusButterKnife 绝对不会陌生吧.(当年)两者对于Android开发界,不亚于蒸汽机之于工业革命,微积分之于数学界。(偶感不适者,请立刻关掉网页)

PS: 没听过说?WTF? Are you kidding me?

这两者内部都是借助于注解来实现其功能的。那么这两个优秀的开源框架在处理注解方面有哪些需要我们借鉴or改善的地方呢?

这篇文档的目的正源于此…(要不然我所为何来…)

我们知道处理注解离不开注解解释器(AbstractProceesor),我们先来看一下两者在解释器上的区别(只列举关键部分):

  1. ButterKnifeProcessor
@AutoService(Processor.class)
@IncrementalAnnotationProcessor(IncrementalAnnotationProcessorType.DYNAMIC)
@SuppressWarnings("NullAway") // TODO fix all these...
public final class ButterKnifeProcessor extends AbstractProcessor {

    ...
    // 感兴趣的朋友可以点进去看源码,ButterKnife使用的JavaPoet来生成代码的
}
  1. EventBusAnnotationProcessor
@SupportedAnnotationTypes("org.greenrobot.eventbus.Subscribe")
@SupportedOptions(value = {"eventBusIndex", "verbose"})
@IncrementalAnnotationProcessor(AGGREGATING)
public class EventBusAnnotationProcessor extends AbstractProcessor {
        ...
        // 而EventBus使用的是JavaWriter来生成代码的
}

这里我们的讨论重点是:驱动注解解释器起作用的部分。通过上面的源码部分我们可以很清楚的发现:

ButterKnife 使用的是Google家的 AutoService,这个大家应该都很熟悉(业界标志,本项目用的也是它);

EventBus 我们没有找到AutoService的身影,但是聪明的读者会发现,两者都有这个注解 IncrementalAnnotationProcessor。其中必有玄机。这时我们可以通过EventBusAnnotationProcessor/build.gradle 去发现点线索。

dependencies {
    ...
    def incap = '0.2'
    compileOnly "net.ltgt.gradle.incap:incap:$incap"
    annotationProcessor "net.ltgt.gradle.incap:incap-processor:$incap"
    ...
}

直接去Github搜一下就能找到它啦—————— gradle-incap-helper

Helper library and annotation processor for building incremental annotation processors

增量注解解释器的库

Gradle 4.7 comes with some level incremental annotation processing support. Gradle 4.8 goes farther by making it possibly dynamic.

Gradle 4.7 带来了一些增量注解处理的支持。Gradle 4.8通过使其可能是动态的更进一步。

通过butterknife-compiler可以看出ButterKnife在不久以前才支持动态注解处理,而且也是借助于gradle-incap-helper.

注解 @IncrementalAnnotationProcessor 就是来自gradle-incap-helper 库中。我们通过上面的地方可以看出两者在该注解的参数是不相同的。那么这到底是怎么一回事呢?

2. 总结

通过EventBus和ButterKnife我们可以发现,让两者对应的注解解释器起作用的是 AutoServicegradle-incap-helper

其实这两者是帮助我们生成了 /META-INF/gradle/注解 目录和文件的功能.(PS:感兴趣的可以自行了解,这里不展开论述)

PS: ButterKnife这是本着"人无我有,人有我优"的宗旨在办事啊


AnnotationsExplorer 欢迎Fork & Star…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值