首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Java中的Kotlin反射

如何使用Java中的Kotlin反射
EN

Stack Overflow用户
提问于 2020-10-26 15:20:30
回答 1查看 799关注 0票数 3

可以使用Java的Kotlin反射吗?

我希望从Java中的Kotlin函数中获取KCallable,并使用它的方法callBy调用带有默认参数的方法。

以Kotlin为例:

代码语言:javascript
运行
复制
fun test(a: String = "default", b: String): String {
    return "A: $a - B: $b";
}

fun main() {
    val callable: KCallable<*> = ::test
    val parameterB = callable.parameters[1]

    val result = callable.callBy(mapOf(
        parameterB to "test"
    ))

    println(result)
}

有可能吗?如果是这样的话,如何从Java代码中获取KCallable实例?

编辑:

我不能像建议的那样使用@JvmOverloads,因为参数的数量、默认参数及其位置可能是任意的。

呼叫的已知信息是:

  • 论点名称
  • 他们的类型
  • 它们的价值

编辑2:

此处不工作@JvmOverloads的示例:

代码语言:javascript
运行
复制
fun test(a: String = "default", b: String = "default"): String {
    return "A: $a - B: $b";
}

在这里,使用一个String值进行调用是不明确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 18:41:39

如果声明test函数的文件是Utils.kt,那么它将被编译成UtilsKt类。

作为文档

通常,如果您使用默认参数值编写Kotlin函数,则它在Java中仅以完整签名的形式出现,并包含所有参数。如果希望向Java调用方公开多个重载,可以使用@JvmOverload注释。

因此,在添加了这个注释之后:

代码语言:javascript
运行
复制
@JvmOverloads 
fun test(a: String = "default", b: String): String {
    return "A: $a - B: $b";
}

可以使用单个参数从java调用test方法:

代码语言:javascript
运行
复制
public class ReflectionInterop {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method test = UtilsKt.class.getDeclaredMethod("test", String.class);
        String result = (String) test.invoke(null, "test"); //null used because method is compiled as static, so no instance needed to call it
        System.out.println(result); //Will print "A: default - B: test"
    }
}

编辑

如果您正在寻找一种方法来克服方便的java互操作的局限性,那么您确实需要在您的Java代码中获得一个KCallable实例。

我认为没有辅助Kotlin函数是不可能的:

代码语言:javascript
运行
复制
fun testReflection(): KCallable<*> = ::test

它在Java中的使用非常简单:

代码语言:javascript
运行
复制
public class ReflectionInterop {
    public static void main(String[] args) {
        KCallable<?> test = UtilsKt.testReflection(); //Assuming it is located in the same `Utils.kt` file
        KParameter parameterB = test.getParameters().get(1);
        String result = (String) test.callBy(new HashMap<>() {{
            put(parameterB, "test");
        }});
        System.out.println(result); //Will print "A: default - B: test"
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64539969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档