Annotation 处理时机

处理 Annotation 的时机

一般来说,annotation 可以在 compile time 或是 runtime 的时候做处理。

  • Compile time
    • 利用 annotation processor 去读取 annotation 的资讯,接着利用这些资讯去产生针对该 annotation 的程序码。 (用程序去写程序,很酷吧!?)
  • Runtime
    • 在执行期间透过 proxy 或 reflection 去读取 annotation 的资讯,进行相对应的动作。

在这两者各有优缺点,annotation processor 虽然可以在 runtime 的时候直接进行 parse ,省下不少读取 annotation 和爬结构的时间,但缺点就是 compile 的时候会比较久。相反地,runtime 透过 proxy 或 reflection 的方式去爬资料,虽然不用花 compile 的时间,但 runtime 会花时间处理 annotation 和资料结构。之前在实作的时候,我们有做实验,也有权衡了一下这两者之前的优劣,後来选择了 annotation processor ,因为 podcast 满多的格式档案都满大的,而且 tag 多种又复杂,靠 runtime 处理实在是会花很多时间在处理结构,Android 开发常用的 gson 和 Retrofit 就是在 runtime 处理 annotation 。

// Retrofit
interface GitHubService {
  @GET("users/{user}/repos")
  suspend fun listRepos(@Path("user") user: String)
}

另一个有趣的是,如果你是 Android 的开发者应该对於 dagger 这个 library 不陌生,他们有提供一些 annotation 让使用者来自订一些东西,像是 @Inject@Component 或者 @Provides 之类的,这背後就是在 compile time 就已经决定好要帮你产生哪些 dependency injection 会用的 class 。而我们的目标就是要可以做到类似的效果,透过自定义的 annotation 去产生对应的 parser ,让我们不用自己写程序码,也可以达到自定义资料格式和 parser 的效果。

// Dagger
@Provides
fun provideUserRepository(): UserRepository {
	return UserRepository()
}

<<:  D14-(9/14)-台泥(1101)-全台湾第一号股票

>>:  Day 01 - objective C 基础语法

Day_03 系统安装(二)

接续昨日的动作,将SD卡插到Raspberry Pi後插电开机,这时如果有接萤幕会出现开机进度 如果...

.Net Core Web Api_笔记25_api结合EFCore资料库操作part3_产品分类资料的编辑与删除(EF的更新写法怎麽这麽多种!如何观察EF产生的SQL)

我们在上一篇的Show.html 已经完成了资料查询呈现 这里要多出操作(比方像是编辑、删除...)...

[Android Studio 30天自我挑战] Toast浮动显示快显元件

Toast元件可以短暂的在画面跳出提示讯息,并且不会影响Activity处理程序,当达到短暂秒数後便...

DAY20-JAVA的介面

介面 介面(interface)是JAVA所提供的另一项重要功能,它的结构和抽象类别非常相似。介面本...

如何正确选择的高防服务?

如何正确选择高防服务呢?首选是高防CDN。那麽它具备哪些优势呢? 高防CDN的优势   CDN即内容...