我如何在 Kotlin 中获取 KmutableProperty 的容器?
How do I get container of KmutableProperty i Kotlin?
我在class A 中有一个val prop:KMutableProperty1<<A,Any>>
字段x,我可以通过prop.name
获取字段名称但是如何获取它的容器class 名称(A )?
我认为这将取决于您如何获得此 属性 参考,但如果您这样做:
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
同样,这几乎不会在所有情况下都起作用,因为 有 这些属性实际上 return 的接口的其他实现,因此转换可能会失败.
访问声明 class 是很棘手的,因为属性可能有不同的实现细节,具体取决于它们的定义方式。
通过使用潜在的支持字段以及 public getter 我们可以创建一种非常强大的方式来访问声明 class:
fun KProperty<*>.declaringClass(): Class<*> {
return (this.javaField as Member? ?: this.javaGetter)?.declaringClass
?: error("Unable to access declaring class")
}
如果该项目是支持的 属性,该字段将定义它在其中声明的 class。否则它将采用 class 声明 getter。
我遇到了同样的问题。我的解决方案如下。希望总体适合:
class Person {
var firstname = "Stacey"
}
fun main() {
// Let's take property 'firstname' (which would be x) of class 'Person' (should be A) as example. Get the corresponding KMutableProperty.
val kMutableProperty = Person::class.members.filter { it.name == Person::firstname.name }.first()
// Get the kotlin type of the parent class, the class owning the property. For that example the kotlin type of class 'Person' is returned.
val parentKClass = (kMutableProperty.parameters[0].type.classifier as KClass<out Any>)
// In addition, get the name of type
val parentKClassName = parentKClass.simpleName
}
我在class A 中有一个val prop:KMutableProperty1<<A,Any>>
字段x,我可以通过prop.name
获取字段名称但是如何获取它的容器class 名称(A )?
我认为这将取决于您如何获得此 属性 参考,但如果您这样做:
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
同样,这几乎不会在所有情况下都起作用,因为 有 这些属性实际上 return 的接口的其他实现,因此转换可能会失败.
访问声明 class 是很棘手的,因为属性可能有不同的实现细节,具体取决于它们的定义方式。 通过使用潜在的支持字段以及 public getter 我们可以创建一种非常强大的方式来访问声明 class:
fun KProperty<*>.declaringClass(): Class<*> {
return (this.javaField as Member? ?: this.javaGetter)?.declaringClass
?: error("Unable to access declaring class")
}
如果该项目是支持的 属性,该字段将定义它在其中声明的 class。否则它将采用 class 声明 getter。
我遇到了同样的问题。我的解决方案如下。希望总体适合:
class Person {
var firstname = "Stacey"
}
fun main() {
// Let's take property 'firstname' (which would be x) of class 'Person' (should be A) as example. Get the corresponding KMutableProperty.
val kMutableProperty = Person::class.members.filter { it.name == Person::firstname.name }.first()
// Get the kotlin type of the parent class, the class owning the property. For that example the kotlin type of class 'Person' is returned.
val parentKClass = (kMutableProperty.parameters[0].type.classifier as KClass<out Any>)
// In addition, get the name of type
val parentKClassName = parentKClass.simpleName
}