代码之家  ›  专栏  ›  技术社区  ›  ssuukk

如何获取kmutableproperty i kotlin的容器?

  •  0
  • ssuukk  · 技术社区  · 6 年前

    我有一个 val prop:KMutableProperty1<<A,Any>> 对于类中的字段x,我可以通过 prop.name 但如何获取它的容器类名(a)?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Kiskae    6 年前

    访问声明类是很棘手的,因为属性可以有不同的实现细节,具体取决于它们是如何定义的。 通过同时使用潜在的backing字段和public getter,我们可以创建一种非常健壮的方法来访问声明类:

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

    如果项是后台属性,则字段将定义在其中声明的类。否则它将使用声明getter的类。

        2
  •  2
  •   zsmb13    6 年前

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

    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
    

    再说一次,这在任何情况下都不会起作用,因为 这些属性实际返回的接口的其他实现,因此强制转换可能会失败。