【发布时间】:2022-06-11 02:49:27
【问题描述】:
我最近一直在玩 KSP,并设法开发了一些有趣的功能(例如基于布局 id 的自动回收视图和视图持有者生成器),到目前为止一切都很好。
但是,我现在尝试做一些不同于根据我设计的注释创建文件的事情。而不是创建文件,我只想用我注释的类/对象填充一个列表。
例子:
ClassA.kt
@MyAnnotation
class ClassA(context: Context): SomeBaseClass(context) {
override fun baseClassFunction() {
// custom code goes here
}
}
ClassB.kt
@MyAnnotation
class ClassB(context: Context): SomeBaseClass(context) {
override fun baseClassFunction() {
// custom code goes here
}
}
MyListAgregator.kt
object MyListAgregator {
const val classList: List<SomeBaseClass> = mutableListOf()
}
我的自定义 KSP 将执行以下操作
- 收集所有由我注释的类/对象(通常)
@MyAnnotation - 使用适当的创建它们的实例 参数(在这种情况下只是一个上下文)
- 将每一项添加到
classList中的MyListAgregator
我总能找到类集合的重点(第 1 步),但其余部分对我来说完全是个谜,感觉 KSP 总是希望创建代码,而不是执行它?也许我对后一个不正确,但我找不到与可用文档中解释的内容相关的任何内容。
我考虑过的另一种选择,但宁愿避免担心任何负面影响(例如性能)是实际修改 MyListAgregator 文件以将所有实例包含在列表中,就好像我已经编写它们一样我。但是,如果可能的话,我仍然更愿意使用上一个选项。
【问题讨论】:
-
KSP 在编译时运行,因此它无法在应用程序运行时执行某些操作,如果这就是您所说的“执行代码”
-
@gpunto 我明白了,所以我的感觉是正确的,它的目的是创建代码,而不是执行代码代码 - 除了创建代码本身所必需的(符号等)。
-
KSP 的工作方式与您的 IDE 中的插件类似,该插件可以根据您的其他源代码生成源代码。您可以使用 KSP 生成您的
MyListAgregator,其中包含初始化所有类的代码。 -
@broot 知道了,所以基本上我想避免的“B计划”实际上是唯一且正确的选择
标签: android kotlin annotations ksp