【问题标题】:How to set delegated property value by reflection in kotlin?如何在 kotlin 中通过反射设置委托属性值?
【发布时间】:2017-06-01 10:01:23
【问题描述】:

我的实体类:

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$delegate 到 java.lang.String

如何做到这一点?

【问题讨论】:

  • 您是想用另一个实例替换委托,还是只是像record.name = "aa"一样反射性地设置属性值?
  • 嘿,也许我的回答有帮助:stackoverflow.com/a/56115232/2939453

标签: reflection delegates kotlin


【解决方案1】:

如果您想像 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 反射来做到这一点,首先为您的属性找到设置器:

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

但至少目前无法覆盖该属性的委托实例,因为存储它的字段name$delegatefinal

【讨论】:

  • Callable 需要 2 个参数?为什么 ? kotlin-reflect 版本是什么?
  • 哦,是代码出错了,你应该实际传递对象和属性值:property.setter.call(record, "value")。修复了这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2018-02-07
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多