当前位置: 首页 > 知识库问答 >
问题:

如何使用 Kotlin 符号处理 (KSP) 填充现有列表

赵选
2023-03-14

我最近一直在玩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
    }
}

myListGregator.kt

object MyListAgregator {
    const val classList: List<SomeBaseClass> = mutableListOf()
}

我的自定义KSP将执行以下操作

  1. 收集所有由my@MyAnnoection
  2. 注释的类/对象(通常)
  3. 使用适当的参数创建它们的实例(在本例中只是一个上下文)
  4. 将每一个添加到MyListAssocigator
  5. 中的 class List

我总能找到类集合的要点(步骤1),但其余的对我来说完全是个谜,感觉KSP总是期望创建代码,而不是执行它?也许我对后者的理解是不正确的,但是我在可用的文档中找不到任何相关的解释。

我考虑过的另一种选择,但出于对任何负面影响(例如性能)的考虑而宁愿避免,那就是直接修改MyListAssocigator文件以包含列表中的所有实例,就好像我自己写的一样。但是,如果可能的话,我仍然更喜欢使用前面的选项。

共有1个答案

颜嘉福
2023-03-14

首先,您需要建立一个规则集,该规则集将应用于使用您的注释(KSP词汇表中的符号)注释的类。例如,它们必须包含一个参数,该参数必须是成员属性并且类型为Context并且必须是的子类一些BaseClass。我建议首先查找正确的继承,然后查找参数计数和类型。

您仍在阅读和探索所有带有此符号的文件。基于这个规则集进行过滤,您将在第2点获得一组类。

在这里,KSP可以为您提供生成代码的接口。然而,KSP不会让你编辑源文件,而是根据你的条件生成一个新的。在这里,您必须通过访问重写的函数来编写它的实现

您可以保留输出(在步骤2中新生成的类)并生成您的< code>MyListAggregator对象。

 类似资料:
  • 如何使用Idea和Gradle调试KSP? 在调试模式下从IDE运行任务不会将IDE附加到进程。 有没有任何命令行方法让处理器等待IDE附加到进程? (我使用的是KSP)

  • 问题内容: 根据http://www.newtonsoft.com/json/help/html/PopulateObject.htm,您可以通过JSON字符串中定义的值来更新现有实例。我的问题是,我必须填充该对象的数据已经被解析为JToken对象。我当前的方法如下所示: 是否有更好的方法来完成此任务,而不必首先还原在创建JToken时已经完成的解析? 问题答案: 使用阅读器并将其传递给。返回的阅

  • 问题内容: 如何用对象类型的列表中的值填充JTable。我的代码如下所示: 我已经有了列,列表将来自schedule变量?考虑这些列,如何将其放到表中? 问题答案: 看一下DefaultTableModel。您可以遍历List并为每一行创建Object数组。

  • 我正在尝试从相应的字符串值填充Kotlin数据类。我使用GSON查看了来自Json的:Kotlin数据类,但我试图做的并不是跟踪完全相同的: 调用此函数并尝试填充以下类: 但没有欢乐。stringValue是gson.toJson(value)生成的东西,其中value是一个JSONObject。 有人知道我的断线是什么吗?

  • 问题内容: 我使用Json.Net这样填充一个类: 上面的结果JSON字符串填充了我的类中的几个属性。稍后我有一个新的JSON字符串,并希望使用其余属性填充相同的类。是否可以使用JSON.NET或方法?我基本上想在上面的代码行中添加/添加到我填充的帐户对象中。 我的课: 问题答案: 是的,您可以使用第二个JSON字符串来填充现有对象的属性。 这是一个例子: 输出: 小提琴:https : //do

  • 在我的系统中,在二进制(十进制255)中是(预期是8位字符)1111 1111。 类似地,如预期的0111 1111。左边填满了一个零。 是预期的1000 0000。 例如,现在我想生成未签名的字符0010 0000。 我尝试了,但输出1110 0000....怎么了?为什么左边突然被一个塞满了? 如何生成启用第N位(从左侧开始)的? 我想 此刻,正在给我 对于、存在此问题,但对于或更高版本不再发