首页 > 解决方案 > 如何从字符串名称调用 kotlin 中的函数?

问题描述

给定一个字符串名称列表,是否可以从特定值动态调用正确的方法?

在示例中,invokeMethod 是组成的,但理想情况下它是我需要的。第一个参数是要调用的方法名称,第二个参数是参数列表。

class MethodPicker() {
    val commands = listOf("foo", "tango")

    fun messageReceiver() {
        messageParam : String = "Hi stackoverflow!"
        invokeMethod(commands.random(), messageParam) //HOW TO DO THIS IN KOTLIN?, the first parameter is the methodf name and the second one would be the parameters that the method receives
    }

    fun foo(message: String) {
        println(message + "foo!")
    }
    fun tango(message: String) {
        println(message + "tango!")
    }
}

标签: kotlin

解决方案


可能有一种使用反射的方法来做到这一点——但这应该只是最后的手段。(它可能冗长、脆弱、缓慢、难以维护和不安全。对于框架、插件和编译器工具很方便;但对于一般编程,通常有更好的方法。)

除了名称之外,这里的一种方法是存储对它应该调用的函数的引用。

您可以使用这样的简单类来存储它们:

class Method(val name: String, val method: (String) -> Unit)

((String) -> Unit是接受单个 String 参数的函数的类型,并且不返回有用的值。)

您的命令列表可能是:

val commands = listOf(Method("foo", ::foo), Method("tango", ::tango))

(::为您提供对方法/函数的可调用引用。因为foo()andtango()是实例方法,您通常必须提供实例来调用它们,例如myInstance::foo- 但由于列表是在实例方法中定义的,编译器已经知道.)

你可以调用一个随机函数:

commands.random().method(messageParam)

列出名称和引用可能看起来有点冗长,但它更高效、更安全:编译器可以在运行时检查所有内容,您甚至可以将显示的字符串翻译成不同的语言,而无需全部重写编码。)


推荐阅读