如何通过reflection运行挂起方法?

有一个协程块可以运行暂停function。

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

 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 { override fun resume(value: Unit) {} override fun resumeWithException(exception: Throwable) { val currentThread = Thread.currentThread() currentThread.uncaughtExceptionHandler.uncaughtException(currentThread, exception) } } fun main(args: Array) { 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中的每个suspend方法都在JVM上通过在协程设计文档中解释的CPS转换来表示。 Javareflection并没有意识到这一点,Kotlinreflection当前不提供便捷的方法来执行挂起函数的调用。

你必须通过帮助函数自己完成CSP转换。 我建议为此目的实施以下帮助程序:

 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) } 

现在,如果在代码中用invokeSuspend替换invokeSuspend ,那么它就像预期的那样工作。