Hilt限定符:如何选择AnnotationRetention.BINARY与RUNTIME?
如何为Hilt限定符选择AnnotationRetention.BINARY或RUNTIME?
核心判断依据
先明确两个Retention的本质差异:
AnnotationRetention.BINARY:注解仅保留在编译后的字节码中,运行时无法通过反射获取AnnotationRetention.RUNTIME:注解在编译和运行时均保留,支持反射访问
对应Hilt的使用场景,按以下规则选择:
选BINARY的情况:
只要你的限定符仅用于Hilt编译期生成依赖注入代码,业务代码不会在运行时通过反射获取带该限定符的实例,就用BINARY。
优势:减少运行时注解的内存开销,缩小APK体积,避免反射带来的性能损耗。选RUNTIME的情况:
如果需要在运行时通过反射处理该限定符,比如:- 手动用反射实例化带有该限定符的注入对象
- 使用Dagger/Hilt的反射API(比如通过限定符动态查找Provider)
这种场景必须用RUNTIME,否则反射时会找不到注解。
结合示例代码分析
你给出的代码里混用两种Retention是合理的:
// CoroutinesQualifiers.kt 文件 @Retention(AnnotationRetention.RUNTIME) @Qualifier annotation class DefaultDispatcher @Retention(AnnotationRetention.RUNTIME) @Qualifier annotation class IoDispatcher @Retention(AnnotationRetention.RUNTIME) @Qualifier annotation class MainDispatcher @Retention(AnnotationRetention.BINARY) @Qualifier annotation class MainImmediateDispatcher
- 前三个限定符用RUNTIME,可能是作者考虑到调试或某些特殊场景需要反射访问,但如果业务中不需要反射,完全可以改成BINARY。
MainImmediateDispatcher用BINARY,说明这个限定符仅用于Hilt编译期注入,不会在运行时被反射调用,完全匹配BINARY的适用场景。
总结
没有强制要求统一使用一种Retention,只需根据每个限定符的实际使用场景选择:不需要反射就用BINARY(更高效),需要反射就用RUNTIME。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

