关于顶层扩展函数/属性的Receiver问题
来源:4-8 扩展成员

二階堂夢月
2019-02-27
打扰正处于百忙之中的benny老师了,若能抽出时间看看学生的小问题不胜感激
最近在尝试使用kotlin反射编写框架,需要通过反射获取顶层扩展属性的setter。反射得出KMutableProperty的setter,需要接收两个receiver和一个value。对于一个扩展属性而言,我这边明白其中一个receiver是扩展的类的实例。但是,我不知道如何获取第二个receiver(有考虑顶层变量是对应java中的“SampleClassName”Kt,但依然不知道如何在kotlin中获取),以及两个receiver在setter中对应参数的顺序应该是如何。因此总结为如下两个问题:
- 如何获取顶层扩展函数/属性的两个receiver?
- 扩展属性的setter中,两个receiver的参数顺序如何?
相关代码如下:
- KMutableProperty中set的相关定义:
/**
* 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
}
写回答
2回答
-
bennyhuo
2019-02-27
你是给某一个类定义了一个扩展属性,然后要反射修改?这个需求也是很奇怪的样子。反射的 memberExtensionProperties 是指定义在该类当中的扩展属性,并不是该类的扩展属性,因此如果你在 X 当中定义了 Y 的扩展属性,要用 X::class.memberExtensionProperties,receiver 的顺序应该就是这二者的书序,你试试就可以了,不行就反过来~
至于顶层的扩展方法,应该是没有可以获取列表的。
042019-02-28 -
bennyhuo
2019-02-27
什么鬼。。看的我一头雾水,你发个完整的源码上来看看。。
00
相似问题