从Delegate属性的getValue()和setValue()函数外部获取KProperty信息

我试图用委托Kotlin属性实现JavaFX Property接口,以便它可以像这样使用:

class Foo(bar:Bar){ val barProperty=PropertyFX(bar) var bar by barProperty } 

我为此写了一个小类(大部分):

 class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ override fun getValue(thisRef:Any?,property:KProperty<*>)=get() override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value) } 

但是,这个类没有实现接口的getBean()和getName()方法。 它们应该分别从getValue()和setValue()函数中引用的参数中返回值thisRef和property.name,但是我不能从函数外部访问这些参数。

我可以在第一次使用时存储这些值,如下所示:

 class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ private var bean:Any?=null private var name="" override fun getBean()=bean override fun getName()=name override fun getValue(thisRef:Any?,property:KProperty<*>):T{ bean=thisRef name=property.name return get() } override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){ bean=thisRef name=property.name set(value) } 

但是,这似乎是一个可怕的黑客攻击,它不返回正确的值getBean()和getName(),直到该属性被访问一次。 有没有办法获得这些值,而不需要传递给构造函数,就像SimpleObjectProperty所要求的那样 ?

在Kotlin 1.1(自1.1-M04开始)中,可以使用provideDelegate运算符约定来定义一个函数,当创建委托的实例时,该函数将被调用一次。 在你的例子中,你可以在PropertyFX声明provideDelegate ,并返回一个新的委托与容器和属性的信息。 更多信息: https : //blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate

这在Kotlin的预发布版本中是可行的,在委托属性的初始设置期间,委托属性具有额外的方法propertyDelegated() 。 这个方法在1.0之前被删除,但是它可能会在未来的版本中被重新添加(或者等价的特性)。

现在,我怀疑你现有的解决方案是最好的可能性。