如何在Kotlin中将String转换为Function?

时间:2019-04-04 09:39:15

标签: kotlin

fun getApple(): Apple = {...}

fun setOrange(orange: Orange) {...}

val funMap = hashMapOf("getApple" to this::getApple, "setOrange" to this::setOrange)

funMap["getApple"]()

我想将方法​​放在地图上。 然后按字符串获取方法,但是如果函数类型不同,则无法调用该方法。还有其他将字符串转换为函数的方法吗?

----更新----

我以前曾经使用过Java反射,我正在寻找一种更有效的方法

2 个答案:

答案 0 :(得分:1)

可能,但是您的地图类型为Map<String, KFunction<Any>>。对于KFunction,您可以使用方法.call.callBy(Map<KParameter, Any>)。因此,请参见此示例(调用函数时,我还添加了日志记录):

class StackStringFunction {

    data class Apple(val size: Int = 1)
    data class Orange(val color: String = "orange")

    fun getApple(): Apple {
        println("Calling getApple()")
        return Apple()
    }

    fun setOrange(orange: Orange) {
        println("Calling setOrange(Orange) with param $orange")
    }

    val funMap = hashMapOf("getApple" to this::getApple, "setOrange" to this::setOrange)
}

// Invocation example:
with(StackStringFunction()) {
    this.funMap["getApple"]?.call()
    this.funMap["getApple"]?.callBy(mapOf())

    this.funMap["setOrange"]?.call(StackStringFunction.Orange())
    this.funMap["setOrange"]?.callBy(mapOf(this.funMap["setOrange"]!!.parameters[0]to StackStringFunction.Orange()))
}

输出:

Calling getApple()
Calling getApple()
Calling setOrange(Orange) with param Orange(color=orange)
Calling setOrange(Orange) with param Orange(color=orange)

如您所见,通过::sth可以获得的不是KFunction,而是使用KFunction接口可以调用这些方法。

答案 1 :(得分:0)

在kotlin中,Any是所有层次结构的根类。因此,在方法hashmap中,您可以尝试:-

var funMap : HashMap<String, ()-> Any> = hashMapOf()
funMap.put("getApple" , this::getApple)
funMap.put("setOrange" , this::setOrange)

并在获取方法时:-

funMap["getApple"] as ()-> Apple