我在类A中有一个{x1}字段x,我可以通过val prop:KMutableProperty1<<A,Any>>
来获取字段名称,但是如何获得其容器类名称(A)?
答案 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")
}
如果该项目是支持属性,则该字段将定义在其中声明的类。否则,将使用该类来声明吸气剂。