关于顶层扩展函数/属性的Receiver问题

来源:4-8 扩展成员

二階堂夢月

2019-02-27

打扰正处于百忙之中的benny老师了,若能抽出时间看看学生的小问题不胜感激

最近在尝试使用kotlin反射编写框架,需要通过反射获取顶层扩展属性的setter。反射得出KMutableProperty的setter,需要接收两个receiver和一个value。对于一个扩展属性而言,我这边明白其中一个receiver是扩展的类的实例。但是,我不知道如何获取第二个receiver(有考虑顶层变量是对应java中的“SampleClassName”Kt,但依然不知道如何在kotlin中获取),以及两个receiver在setter中对应参数的顺序应该是如何。因此总结为如下两个问题:

  1. 如何获取顶层扩展函数/属性的两个receiver?
  2. 扩展属性的setter中,两个receiver的参数顺序如何?

相关代码如下:

  1. 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)
  1. 项目中相关代码:
   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 的顺序应该就是这二者的书序,你试试就可以了,不行就反过来~

至于顶层的扩展方法,应该是没有可以获取列表的。

0
4
bennyhuo
回复
二階堂夢月
顶层是无法获取的~不客气
2019-02-28
共4条回复

bennyhuo

2019-02-27

什么鬼。。看的我一头雾水,你发个完整的源码上来看看。。

0
0

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程