最近在尝试使用kotlin反射编写框架,需要通过反射获取顶层扩展属性的setter。反射得出KMutableProperty的setter,需要接收两个receiver和一个value。对于一个扩展属性而言,我这边明白其中一个receiver是扩展的类的实例。但是,我不知道如何获取第二个receiver(有考虑顶层变量是对应java中的“SampleClassName”Kt,但依然不知道如何在kotlin中获取),以及两个receiver在setter中对应参数的顺序应该是如何。因此总结为如下两个问题:
相关代码如下:
/**
* Modifies the value of the property.
*
* @param receiver1 the instance of the first receiver.
* @param receiver2 the instance of the second receiver.
* @param value the new value to be assigned to this property.
*/
public actual fun set(receiver1: D, receiver2: E, value: R)
private fun setValueByProperty(view: V, value: T): Boolean {
return view::class.memberExtensionProperties.find {
it.name == propertyOrFunctionName
}?.let {
it as KMutableProperty2
}?.run {
//两个null即两个receiver,
//其中一个扩展的receiver可以传入
//而另一个作为顶层属性的receiver不知道如何获取
setter.call(null, null, value)
true
}?:false
}