如何通过反射获取伴随方法引用(Function<>)

How get companion method reference (KFunction<>) by refelection

在Java中可以通过以下方式获取对静态方法的引用(使用反射):

Method method = Class.forName("java.util.HashMap").getMethod("put", Object.class, Object.class);

在 Kotlin 中,可以通过以下方式(使用反射)获取实例方法的引用(类型 KFunctionX<>) ):

    var methodRef : KFunction0<Unit> = someInatance::instanceMethod

但是当试图在下面得到一个伴随方法(使用反射)方式:

    var companionMethod = SomeJavaClass::someCompanionMethod

我收到未解决的引用错误

您需要指定您想要伴生对象:

val companionMethod = SomeJavaClass.Companion::someCompanionMethod

正如 docs 所建议的,当您不为伴随对象(未命名的伴随对象)提供名称时,它默认为 Companion

因此以下应该可以正常工作:

val companionMethod = SomeKotlinClass.Companion::someCompanionMethod

如果你命名你的伴生对象,你可以用它的名字来引用它:

class SomeKotlinClass {
    companion object Named {
        fun someCompanionMethod() {...}
    }
}

val companionMethod = SomeKotlinClass.Named::someCompanionMethod

编辑:

由于 OP 仍然不明白为什么 SomeKotlinClass::someCompanionMethod 不起作用。解释如下:

当你从它调用函数时,你仍然可以用 .Companion 引用它,比如 SomeKotlinClass.Companion.someCompanionMethod(...)

// This works :)
val s = SomeKotlinClass
val companionMethod = s::testFunction

// but this doesn't :(
val companionMethod = SomeKotlinClass::testFunction

嗯,这是因为 :: 没有解析同伴。

为什么?因为它会产生歧义,因为同名函数可以在 companion 和 class 中定义,因此无法区分它们。

但是在调用站点编译器可以区分成员调用和伴随调用,因为您将伙伴调用为 SomeKotlinClass.testFunction() 并在其实例上调用成员:instanceOfSomeKotlinClass.testFunction().