这确实是一个Kotlin bug。私人财产在
object
编译为Java静态字段,不需要设置接收器参数。YouTrack上关于这个问题有三个不同的问题
吸气剂
:
KT-55449
,
KT-55872
,以及
KT-23267
.
现在的一个解决方法是检测这样一个字段,并使用Java反射进行设置。
private fun test(kClass: KClass<out Greeter>, receiver: Greeter?) {
val property = kClass.declaredMemberProperties
.filterIsInstance<KMutableProperty1<Any?, Any?>>()
.first {
it.name == "variable"
}
property.isAccessible = true
val field = property.javaField
if ((field?.modifiers?.and(Modifier.STATIC or Modifier.PRIVATE) ?: 0) > 0) {
field?.set(null, "Hello World!")
} else {
property.set(receiver, "Hello world!")
}
receiver?.helloWorld()
}