【发布时间】:2023-04-05 11:27:01
【问题描述】:
我正在尝试访问类 (FooImpl) 的属性 (id) 的委托。问题是,这个类实现了一个接口(@987654323@),而有问题的属性覆盖了这个接口的一个属性。委托只存在于类中(不能存在于接口中)。
问题是在Foo 类型的变量上使用:: 运算符总是返回Foo 的属性,而不是实际实例的属性。代码中的问题:
import kotlin.reflect.KProperty
import kotlin.reflect.KProperty0
import kotlin.reflect.jvm.isAccessible
interface Foo {
val id: Int
}
class FooImpl(
id: Int,
) : Foo {
override val id: Int by lazy { id }
}
val <T> KProperty<T>.hasDelegate: Boolean
get() = apply { isAccessible = true }.let { (it as KProperty0<T>).getDelegate() != null }
fun main() {
val foo: Foo = FooImpl(1)
println("foo::id.hasDelegate = ${foo::id.hasDelegate}")
println("(foo as FooImpl)::id.hasDelegate = ${(foo as FooImpl)::id.hasDelegate}")
}
打印出来:
foo::id.hasDelegate = false
(foo as FooImpl)::id.hasDelegate = true
但这需要正确实现的编译时知识。我正在寻找的是访问正确的属性,而不必在那里指定FooImpl。
该信息在运行时存在,因为到目前为止我发现的最少 (!) 侵入性解决方法是将 fun idProp(): KProperty0<*> 添加到 Foo 和 override fun idProp() = ::id 到 FooImpl 并使用它访问属性。
还有比这更好的方法吗?
【问题讨论】:
标签: kotlin reflection kotlin-reflect