gpt4 book ai didi

java - 如何通过反射运行挂起方法?

转载 作者:行者123 更新时间:2023-12-01 21:48:22 25 4
gpt4 key购买 nike

有一个协程 block 可以运行挂起函数。

但我通过反射通过 invoke 来调用该函数。这是java风格的调用,显然简单的调用是行不通的。有没有办法异步运行反射方法?如何等待这个方法?

import kotlin.coroutines.experimental.*

class TestClass(val InString: String) {
suspend fun printString() {
println(InString)
}
}

fun launch(context: CoroutineContext, block: suspend () -> Unit) =
block.startCoroutine(StandaloneCoroutine(context))

private class StandaloneCoroutine(override val context: CoroutineContext): Continuation<Unit> {
override fun resume(value: Unit) {}

override fun resumeWithException(exception: Throwable) {
val currentThread = Thread.currentThread()
currentThread.uncaughtExceptionHandler.uncaughtException(currentThread, exception)
}
}

fun main(args: Array<String>) {
launch(EmptyCoroutineContext) {
val a = TestClass("TestString");

for (method in a.javaClass.methods) {
if (method.name == "printString")
method.invoke(a) // Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments

}
}
}

最佳答案

更新

由于 Kotlin 1.3 反射原生支持通过 KFunction.callSuspendKFunction.callSuspendBy 调用挂起函数,因此不再需要上述解决方法。

原始答案

Kotlin 中的每个 suspend 方法都通过 CPS 转换在 JVM 上表示,如 coroutines design document 中所述。 。 Java 反射不知道这一点,Kotlin 反射目前也没有提供执行挂起函数调用的便捷方法。

您必须通过辅助函数自行调用 CPS 转换。我建议为此目的实现以下助手:

import java.lang.reflect.Method
import kotlin.coroutines.experimental.intrinsics.*

suspend fun Method.invokeSuspend(obj: Any, vararg args: Any?): Any? =
suspendCoroutineOrReturn { cont ->
invoke(obj, *args, cont)
}

现在,如果您在代码中将 invoke 替换为 invokeSuspend,那么它将像预期一样工作。

关于java - 如何通过反射运行挂起方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com