如何通过反射获取伴随方法引用(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()
.
在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()
.