我val prop:KMutableProperty1<<A,Any>>
在 A 类中有一个字段 x,我可以通过它获取字段名称,prop.name
但是如何获取它的容器类名称 (A)?
问问题
679 次
2 回答
2
我认为这将取决于您如何获得此属性参考,但如果您这样做:
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
同样,这几乎不会在所有情况下都有效,因为这些属性实际上返回的接口还有其他实现,因此转换可能会失败。
于 2018-06-29T16:44:10.883 回答
1
访问声明类很棘手,因为属性可能具有不同的实现细节,具体取决于它们的定义方式。通过同时使用潜在的支持字段和公共 getter,我们可以创建一种非常健壮的方式来访问声明类:
fun KProperty<*>.declaringClass(): Class<*> {
return (this.javaField as Member? ?: this.javaGetter)?.declaringClass
?: error("Unable to access declaring class")
}
如果项目是一个支持的属性,该字段将定义它在其中声明的类。否则它将采用声明 getter 的类。
于 2018-06-29T16:51:31.427 回答