接下來就可以利用上面的 meta-annotation 去定義我們的屬性。
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
annotation class RssTag
我們把 @RssTag
這個 annotation 定義為可以標註在 class 和 class 的 property ,然後 retention 下在 SOURCE
,因為我們使用 annotation processor ,不是用 reflection 也不需要存在 compile 過的檔案。
Annotation 裡面還可以塞自己定義的屬性,像是字串、陣列,甚至是自定義的 class 型別也是可以的。在這邊,我們加入要 parse 的 tag 名稱和它爬的平台順序陣列。
enum class OrderType {
RSS_STANDARD, ITUNES, GOOGLE
}
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
annotation class RssTag(
val name: String = "",
val order: Array<OrderType> = [OrderType.RSS_STANDARD, OrderType.ITUNES, OrderType.GOOGLE]
)
當我們在讀取 annotation 時,馬上就可以知道該 class 和 property 是要存放哪個名稱的 tag ,以及它的平台讀取的優先順序。除了 tag 之外,我們也可以針對 RSS value 和 attribute 去定義 @RssValue
和 @RssAttribute
。如果這個 tag 的名稱很特別,我們想要特別客製一個去爬取資料,也有定義 @RssRawData
來處理這種狀況。下篇文章我們將會講解這幾個 annotation 的設計想法。
參考資料:
https://kotlinlang.org/docs/annotations.html