在高阶函数中获取函数参数的名称

时间:2018-02-16 07:11:31

标签: java android reflection kotlin introspection

似乎Kotlin不支持获取本地功能等。请参阅以下示例:

fun <T> MutableList<T>.filterOnCondition(condition: (T) -> Boolean): MutableList<T>
{ 
    // For the printline, trying to get the function name, 
    // which in this case is passedAsCondition
    println(condition.reflect()!!.instanceParameter!!.name)
}

fun passedAsCondition (number: Int, multipleOf : Int): Boolean
{
    return number % multipleOf == 0
}

numbers.filterOnCondition { passedAsCondition(it, 5) }

Kotlin返回此错误,因为它尚未映射出来:

  

&#34; kotlin.reflect.jvm.internal.KotlinReflectionInternalError:   反思本地函数,lambdas,匿名函数和本地函数   Kotlin反射&#34;

尚未完全支持变量

https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/EmptyContainerForLocal.kt#L41

但是,通过Java可以做到这一点,不是吗?

1 个答案:

答案 0 :(得分:1)

它是一个匿名函数,因此它的名称将为<anonymous>

val x: (Int) -> Boolean = { passedAsCondition(it, 5) }
println(x.reflect()?.name) //prints <anonymous>

当你有一个lambda { passedAsCondition(it, 5) }时,你怎么能指望反射在这里工作? passedAsCondition是在lambda中进行的一个简单调用,但是你在一个没有名字的无名匿名lambda上调用reflect

普通函数可以与方法引用一起使用,当然它有一个名称:

fun x(a: Int): Boolean {
    passedAsCondition(a, 5)
    return true
}
println(::x.name) //gives x

作为结果,使用适当的反射,以下作品:

fun main(args: Array<String>) {
    mutableListOf(1).filterOnCondition(::passedAsCondition)
}


fun <T> MutableList<T>.filterOnCondition(
    condition: KFunction2<@ParameterName(name = "number") Int, @ParameterName(name = "multipleOf") Int, Boolean>
) {
    println(condition.name)
}

fun passedAsCondition(number: Int, multipleOf: Int): Boolean = number % multipleOf == 0