// normal function
fun something(a: String, b: String): String {
return "$a $b"
}
println(::something.parameters) <- not empty
但是
// anonymous function
var something = fun(a: String, b: String): String {
return "$a $b"
}
println(::something.parameters) <- empty
如何获取匿名函数参数信息?
在第二个代码片段中,
something
是一个属性,因此::something
是对属性的引用。 ::something
属于 KMutableProperty0<(String, String) -> String>
类型。你显然不想获取 property 的参数。
您想要的“函数”是存储在
something
中的值,所以理想情况下您只需执行 something.parameters
即可。然而,something
是(String, String) -> String
,而不是KFunction
,所以你无法对其进行反思。
有一个实验性 API,可以为您提供代表
KFunction
的 (String, String) -> String
- reflect
。
所以你可以这样做:
var something = fun(a: String, b: String): String {
return "$a $b"
}
@OptIn(ExperimentalReflectionOnLambdas::class)
fun main() {
println(something.reflect()?.parameters)
}
对于语言版本(不是编译器版本)2.0,lambda 和匿名函数现在使用
invokedynamic
调用 创建,而 reflect
无法使用这些。
要使其在 2.0 中工作,您可以像这样注释该函数:
var something = @JvmSerializableLambda
fun(a: String, b: String): String { ... }
或使用
-Xlambdas=class
编译器选项。其中任何一个都会使匿名函数编译为类(2.0 之前的旧行为)。