Reflection Kotlin数据类-通过变量访问属性以设置它';s值

Reflection Kotlin数据类-通过变量访问属性以设置它';s值,reflection,kotlin,data-class,Reflection,Kotlin,Data Class,我有这样一个Kotlin数据类: data class User( var id: Int, var name: String? = null, var email: String? = null, var age: Int? = null, var latitude: Float? = null, var longitude: Float? = null ) prop.set(user, "Alex") 然后我创建它的实例 var user

我有这样一个Kotlin数据类:

data class User(
    var id: Int,
    var name: String? = null,
    var email: String? = null,
    var age: Int? = null,
    var latitude: Float? = null,
    var longitude: Float? = null 
)
prop.set(user, "Alex")
然后我创建它的实例

var user = User(1)
然后我试试这个:

val field = "name"
var prop = User::class.memberProperties.find {it -> it.name == field}!!
prop.get(user)
这是可行的,但如果我尝试这样设置值:

prop.setter.call(user, "Alex")
我得到一个错误:

未解析引用:setter

两者都不是这样的:

data class User(
    var id: Int,
    var name: String? = null,
    var email: String? = null,
    var age: Int? = null,
    var latitude: Float? = null,
    var longitude: Float? = null 
)
prop.set(user, "Alex")

(这是基于此处提供的解决方案,但它对我不起作用:)

memberProperties
返回一个
集合,但您需要。所以

if(道具为KMutableProperty1){
(道具为KMutableProperty1).set(用户“Alex”)
}否则{
//如果属性是不可变的,您想做什么?
}

之所以需要强制转换,是因为智能强制转换只会为您提供一个
KMutableProperty1
,而且您无论如何都无法调用
set
,因为编译器不知道接受哪种类型作为其第二个参数。

当您获得所需对象的实例时,只需执行->user.name=“toto”

如果您的目标是JVM平台,那么可以使用Java风格的反射。 要将类user的用户实例的“name”属性设置为“Alex”

要获得“name”属性

val userName = user.javaClass
    .getMethod("get${field.capitalize()}")
    .invoke(user) as String

如果我想准确地将“name”属性设置为“toto”,这是可以的。在我的例子中,我有一个具有20多个属性的对象和一个哈希映射,其中属性的名称和值在此对象中要更改。我可以迭代哈希映射以获得(键、值)对,但我不能简单地通过“user[key]”调用数据类实例属性