Reflection 如何通过反射收集成员,以便稍后作为参数传递

Reflection 如何通过反射收集成员,以便稍后作为参数传递,reflection,kotlin,kotlin-reflect,Reflection,Kotlin,Kotlin Reflect,因此,我正在研究一个概念,该概念涉及自动写入ByteBuffer扩展Bufferizable abstract class Bufferizable { abstract val fieldOrder: Array<String> open fun size(): Int = TODO() var initialized = false open infix fun to(address: Long) { if (initia

因此,我正在研究一个概念,该概念涉及自动写入
ByteBuffer
扩展
Bufferizable

abstract class Bufferizable {

    abstract val fieldOrder: Array<String>

    open fun size(): Int = TODO()

    var initialized = false

    open infix fun to(address: Long) {

        if (initialized) {

            addFunctions.forEach {  }

        } else {

            addFunctions = Array(fieldOrder.size) { null }
            members = Array(fieldOrder.size) { null }

            fieldOrder.forEachIndexed { i, field ->
                val member = this::class.declaredMemberProperties.find { it.name == field }!!
                addFunctions[i] = when (member.returnType) {
                    Mat4::class.defaultType.javaType -> WithAddress::addMat4
                    ...
                    else -> throw Error()
                } as BufferizableAddFunctionType
                members[i] = member.get(this) // error
            }

            initialized = true
        }
    }

    infix fun from(address: Long): Unit = TODO()

    var addFunctions = arrayOf<BufferizableAddFunctionType?>()
    var members = arrayOf<Any?>()
}

typealias BufferizableAddFunctionType = (Any) -> Unit

object WithAddress {

    var address = NULL
    var offset = 0

    fun addMat4(mat4: Mat4) {
        for (i in 0..3)
            for (j in 0..3) {
                memPutFloat(address + offset, mat4[i, j])
                offset += Float.BYTES
            }
    }
    ...
}
然后,无论何时第一次调用
uboVS to address
,它都将被初始化,然后按照指定的顺序将其内容写入本机地址

但我唯一遇到的问题是收集成员,以便稍后作为参数传递给I-th
addFunction

因为编译器在这里抱怨:

members[i] = member.get(this)
错误:(328,37)Kotlin:Out投影类型“KProperty1”禁止使用在Kotlin.reflect.KProperty1中定义的“公共抽象趣味获取(接收方:T):R”


如何解决?

这是一个继承问题。您的反射调用
this::class.declaredMemberProperties.find{…}
返回
KProperty1
这意味着从Bufferizable继承的属性(有关
out
的更多信息,请参阅)。通过复印机,不知道该属性属于哪个类,因此不允许直接访问。要解决此问题,您必须访问getter函数:

members[i] = member.getter.call(this)

通过getter函数属于对象而不是反射api,它遵循默认继承行为,可以调用。

这是一个继承问题。您的反射调用
this::class.declaredMemberProperties.find{…}
返回
KProperty1
这意味着从Bufferizable继承的属性(有关
out
的更多信息,请参阅)。通过复印机,不知道该属性属于哪个类,因此不允许直接访问。要解决此问题,您必须访问getter函数:

members[i] = member.getter.call(this)
通过getter函数属于对象而不是反射api,它遵循默认继承行为,可以调用