如何获取KmutableProperty i Kotlin的容器?

时间:2018-06-29 15:56:22

标签: kotlin kotlin-reflect

我在类A中有一个{x1}字段x,我可以通过val prop:KMutableProperty1<<A,Any>>来获取字段名称,但是如何获得其容器类名称(A)?

2 个答案:

答案 0 :(得分:1)

我认为这将取决于您如何获得此属性引用,但是如果您这样做的话:

class A(var x: Int = 0)

val prop: KMutableProperty1<A, Any> = A::x as KMutableProperty1<A, Any>

然后,这种尝试转换的链可以为您提供KClass实例:

val kclass = (prop as? MutablePropertyReference1)?.owner as? KClass<*>
println(kclass) // class A

同样,这并不是在每种情况下都行得通,因为这些属性实际上还返回了 接口的其他实现,因此强制转换可能会失败。

答案 1 :(得分:1)

访问声明类很棘手,因为属性可以根据定义方式而具有不同的实现细节。 通过同时使用潜在的支持字段和公共获取者,我们可以创建一种非常强大的方法来访问声明类:

fun KProperty<*>.declaringClass(): Class<*> {
    return (this.javaField as Member? ?: this.javaGetter)?.declaringClass
             ?: error("Unable to access declaring class")
}

如果该项目是支持属性,则该字段将定义在其中声明的类。否则,将使用该类来声明吸气剂。