gpt4 book ai didi

generics - 通过反射实现 Kotlin 数据类实例化

转载 作者:行者123 更新时间:2023-12-05 09:12:55 24 4
gpt4 key购买 nike

我正在为连接到 MongoDB 的应用程序编写一个小型数据访问层,我想使用反射自动将查询的实体实例化为(域模型)数据类

我看到有人在谈论将 JSON 反序列化为 Kotlin 数据类,我明白了为什么这是一个选项,因为 MongoDB 以相关的 BSON 格式返回数据。但是,我想对该数据源进行抽象。

所以给定一个字段名称和任意类型的值的映射,我如何定义一个函数 toDomain所以它需要这样的 map 和目标类Class<T>作为参数并吐出 T结果?我被卡住了,因为 newInstance()方法调用(不存在的)默认构造函数,并且我的数据类构造函数参数的数量和类型各不相同,因此我也无法“硬编码”此信息。

编辑:我想澄清一下,我不想知道任何可以简单地插入我的代码中的库(除非它们是开源的并且具有可读的实现),而是我想了解我拥有的可能性对此有反射(reflection)。

最佳答案

您可以使用 KClass<T> (如果你从其他代码得到 Class<T>clazz.kotlin 给你 KClass )。它包含您需要的信息,应该类似于(根据您自己的答案)

fun <T> Document.asInstanceOf(clazz: KClass<T>): T {
val constructor = clazz.primaryConstructor!!
val args = constructor.parameters.map { param ->
this[param.name, param.type.jvmErasure.java]
}
constructor.call(*args)
}

您需要添加 kotlin-reflect您的依赖项可以使用它(不是 KClass 本身,而是它的大部分功能)。

关于generics - 通过反射实现 Kotlin 数据类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com