如何在kotlin中通过反射设置委托属性值?

时间:2017-06-01 10:01:23

标签: reflection delegates kotlin

我的实体类:

class User : ActiveRecord<User>() {
    var name by Column(String.javaClass);
    var id by Column(Int.javaClass);
}

现在我想通过反思设置名称值:

var clazz = User().javaClass
var record = clazz.newInstance()
var field = record.getDeclaredField(it + "$" + "delegate")

field.set(record, "aa")

然后错误:

  

entity.Column字段ActiveRecord4k.User.name $委托给java.lang.String

怎么做?

1 个答案:

答案 0 :(得分:12)

如果您想反复设置属性,就好像它是record.name = "..."一样,那么您可以使用kotlin-reflect,即Kotlin反射API(请参阅the reference)。

使用kotlin-reflect,设置属性值的方法如下:

val property = outputs::class.memberProperties.find { it.name == "name" }
if (property is KMutableProperty<*>) {
    property.setter.call(record, "value")
}

如果委托了该属性,则会将调用分派给该委托。

或者,您可以使用Java反射,首先找到属性的setter:

var setter = clazz.getDeclaredMethod("set" + it.capitalize())
setter.invoke(record, "aa")

但是至少在这一点上,没有办法覆盖该属性的委托实例,因为存储它的字段name$delegatefinal