Reflection Kotlin数据类-通过变量访问属性以设置它';s值
我有这样一个Kotlin数据类: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
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]”调用数据类实例属性