Android 中的APT
一、什么是APT
APT(Annotation Processing Tool 的簡稱),可以在代碼編譯期解析注解,并且生成新的 Java 文件,減少手動的代碼輸入。現在有很多主流庫都用上了 APT,比如 Dagger2, ButterKnife, EventBus3 等
? ? ? ? ? ? 本文通過實現簡單的ButterKnife控件綁定介紹APT的內容
二、AbstractProcessor
? ? ? ? 在編譯時編譯器會檢查AbstractProcessor的子類,并且調用該類型的過程函數,然后將添加了注解的所有元素都傳遞到處理函數中,使得開發人員可以在編譯器進行相應的處理,例如,根據注解生成新的的Java類,這也就是ButterKnife,改造,牽引等開源庫的基本原理。Java的API已經提供了掃描源碼并解析注解的框架,我們可以繼承AbstractProcessor類來提供實現自己的解析注解邏輯。
如何使用Processor
? ? 1.新建java-libreary才可以使用Processor哦
? ? ? ? // 自動注冊processor的類庫谷歌出品
? ? ? ? implementation'com.google.auto.service:auto-service:1.0-rc2'
? ? ? ? //javapoet? 生成java代碼的類庫
? ? ? ? implementation'com.squareup:javapoet:1.7.0'
2.在項目中引入processor
annotationProcessor project(':java工程')
annotationProcessor是APT工具中的一種,他是google開發的內置框架,不需要引入,可以直接在build.gradle文件中使用,如下
創建一個Processor類繼承AbstractProcessor
process 方法會在編譯時被調用,set集合存放著所有被@SupportedAnnotationTypes()標記的注解的Element(例如:所有被BundView注解的View的信息包括全類名,父Element這這里為activity);
processElement處理element 保存所有activity 和 view的信息
createJavaFile 通過javapoet庫就會在build->generated->source->apt目錄下生產java文件
ButterKnife的bund方法就是通過類全名+_BundleView反射獲取類對象實例化
使用方法
不要在意報紅的地方,編譯器問題。是不是和ButterKnife很相似的,其實ButterKnife也是這個原理,當然他的更加復雜。我這里只是簡單的實現,讓大家對APT技術有個了解,具體的還需要大家繼續努力學習。
越努力越幸運,大家共勉