当前位置: 首页 > 知识库问答 >
问题:

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

龙繁
2023-03-14

因此,我正在研究一个概念,它涉及到自动写入一个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
            }
    }
    ...
}

例如,我们的想法是声明以下内容

object uboVS : Bufferizable() {

    var projectionMatrix = Mat4()
    var modelMatrix = Mat4()
    ...

    override val fieldOrder = arrayOf("projectionMatrix", "modelMatrix", "viewMatrix")
}

然后,每当第一次调用uboVS to address时,就会初始化它,然后按照指定的顺序将其内容写入本机地址。

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

因为编译器在这里抱怨:

members[i] = member.get(this)

错误:(328,37)Kotlin:Out投影类型“KProperty1”禁止使用Kotlin中定义的“public abstract fun get(接收方:T):R”。反映KProperty1'

我怎么解决?

共有1个答案

耿永寿
2023-03-14

这是一个继承问题。您的反射调用::class.declaredMemberProperties.find{...}返回一个KProperty ty1

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

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

 类似资料:
  • 我正在尝试开发一些代码来显示bot何时上线,并让嵌入的消息颜色每2秒改变一次其他的东西。(2000ms)但我不知道是怎么回事,我得到一个错误,说或类似的东西。 我所做的是...创建超时。编辑该消息,但它将为uptime部分显示不同的消息/输出。删除并发送消息。 我希望当它联机时,它会发送嵌入消息,然后2秒钟后,它会编辑颜色,等等。 输出是一个bot给出了一个错误,或者根本不工作。

  • 问题内容: 我在类中有以下两种方法: 下面的代码行 印刷品,如何使其印刷? 问题答案: 要使用反射调用以原始类型作为参数的方法: 你可以用 要么 同样适用于其他原始类型

  • 通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。 getFields() getField(String name) getDeclaredFields() getDeclaredField(String name) 上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下: Field 类的常用方法如表 1 所示 表1

  • 我读了一大堆这么多的问题,但我似乎找不到答案。 我有以下课程: 在其他地方,我试图访问这些字符串: 为什么我会得到一个IllegalAccess异常?如果我删除field.get行,我可以在LogCat中看到以下行: 参考资料: 使用反射在Java中获取成员变量值的陷阱 反射:通过反射加载的类中的常量变量 通过反射访问Java静态最终ivar值

  • 问题内容: 我有一个带有接口参数的函数: 我如何通过它传递一个零值,使其通过检查? 方法1: 方法二: 由于https://golang.org/doc/faq#nil_error,第二种方法不起作用 游乐场:https : //play.golang.org/p/V0bMSPcCKI 问题答案: 使用以下内容创建: 问题中的第一种方法不起作用,因为表达式返回。nil接口值的具体类型为nil。 诀

  • 问题内容: 我有一个带有成员A,B,C字符串的struct v。使用反射,我可以获取字段名称及其值: 因为我有名称,并且可以获取值OUT,所以可以为这些字段分配新值吗?我想做的基本上是: 但这显然行不通。如果仅知道字段名称,是否可以将值分配给结构? 在实践中,我试图将来自a的值分配给结构中的相应字段,其中结构和映射定义可能会随着时间的变化而扩展,并且映射可能包含比该结构更多或更少的值。我已经考虑过