我可以从Kotlin中的函数类型变量获得KFunction吗?

Dun*_*gor 4 reflection kotlin

我正在尝试获取定义函数的名称

fun aFunction() = Unit

fun functionName(function: () -> Unit) : String {
  val functionAsKFunction: KFunction<Unit> = someMiracle(function)
  return functionAsKFunction.name
}

assertEquals("aFunction", functionName(::aFunction)) 
Run Code Online (Sandbox Code Playgroud)

Kir*_*man 6

你可以简单地投射() -> Unit到KFunction<*>.从理论上讲,这是一个实现细节,但我认为它不会破坏.

fun functionName(function: () -> Unit) : String {
  val functionAsKFunction: KFunction<*> = function as KFunction<*> 
  return functionAsKFunction.name
}
Run Code Online (Sandbox Code Playgroud)

编辑:显然,这不适用于lambdas(无论如何你会想到什么名字?)为了防止崩溃,你可以使用像这样的安全演员:

fun functionName(function: () -> Unit) : String? {
  val functionAsKFunction: KFunction<*> = function as? KFunction<*> ?: return null
  return functionAsKFunction.name
}
Run Code Online (Sandbox Code Playgroud)