經過前面這麼漫長的鋪陳,我們終於要來講 annotation processor 了!
這張圖是 library 的 annotation processor 運作方式,annotation processor 使用了在前幾篇文章中定義好的 annotation ,透過這些 annotation ,我們可以知道使用者要爬的資料有哪些和他們要被放在什麼樣的資料結構裡,所以我們才會定義了 @RssTag
、 @RssAttribute
、 @RssValue
和 @RssRawData
。接著我們透過 code generator 去產生使用者克制過後的 parser ,這些 parser 的實作方式,可以是我們之前提到的 DOM parser 或是 XmlPullParser 。如果是 Android 平台上使用,可以用 XmlPullParser 產出 Android 專用的客製化 parser 。如果是想要讓任何可以使用 Kotlin 的平台使用,可以用 DOM parser 。Annotation processor 的實作方式也可以用 KAPT 或者 KSP ,KAPT 全名為 Kotlin Annotation Processor Tool 是 Kotlin 用來處理 annotation 的工具,另外一個 KSP ,全名為 Kotiln Symbol Processor ,他的作用跟 KAPT 差不多,但效能據說比 KAPT 好上一倍。Code generator 的部分,我們採用 Kotlin Poet ,它有一系列好用的 API ,讓我們用 Kotlin 程式碼去產生 Kotlin 的程式碼。?
首先我們先切分好 module,以下是專案內有的 module:
:annotation
module:只放 library 定義的 annotation。:processor
module:使用 annotation module ,也放一些兩個平台 processor 會用到的共用的 generator 、 constant 和 util 類別。:android
module:純 android 平台的 processor 程式碼,也有含該平台的測試程式碼。:kotlin
module:Kotlin 平台的 processor 程式碼,也有含該平台的測試程式碼。:testCommon
module:專門放一些測試會用得到共用程式碼。:processorTest
module:進行一些客製化格式的測試,主要都是針對自定義 processor 的測試。