因此,我正在研究一个概念,它涉及到自动写入一个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'
我怎么解决?
这是一个继承问题。您的反射调用::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的值分配给结构中的相应字段,其中结构和映射定义可能会随着时间的变化而扩展,并且映射可能包含比该结构更多或更少的值。我已经考虑过