java - 获取高阶函数中函数参数的名称

标签 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 返回这个错误,因为它还没有被映射出来:

"kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Introspecting local functions, lambdas, anonymous functions and local variables is not yet fully supported in Kotlin reflection"

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

但是,这肯定可以通过 Java 完成,不是吗?

最佳答案

这是一个匿名函数,因此它的名字将是<anonymous> :

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

当你有一个 lambda { passedAsCondition(it, 5) }您如何期望反射在这里工作? passedAsCondition是在 lambda 内部进行的一个简单调用,但您正在调用 reflect在一个未命名的、匿名的 lambda 上,它没有名字。

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

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

作为结果,利用适当的反射(reflection),以下工作:

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

关于java - 获取高阶函数中函数参数的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48821734/

相关文章:

c# - 使用字符串值通过反射设置属性

java - 无法使用 JavaMail API 连接到 Protonmail

java - 如何在 ASM 中编写 native 代码

android - 在将数据添加到 recyclerview 时添加(或重新输入) fragment 时, fragment 事务滞后

java - Android Studio - 只有一个 fragment/没有标题的设置 Activity

java - 反射访问内部类时的异常

java - 在字节码层面,Java的Class.getEnumConstants()如何知道哪些类是枚举类?

java - 我需要设置一个变量,但我也需要它是最终的。

java - 为 SWT Shell 设置默认字体

android - WebView : how to avoid security alert from Google Play upon implementation of onReceivedSslError