<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

Java注解系列之3rd

只有你盡力了 才有資格說運氣不好
否則你所受的痛苦都是罪有應得
如何知道自己是否真的盡力?嗯,這是個問題…

接著前面的兩篇文章來討論:

注解解釋器(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…

相關推薦
??2020 CSDN 皮膚主題: 黑客帝國 設計師:白松林 返回首頁
彩票送彩金