Java 如何通过refelection获取伴随方法引用(KFunction<;>;)

Java 如何通过refelection获取伴随方法引用(KFunction<;>;),java,android,kotlin,reflection,companion-object,Java,Android,Kotlin,Reflection,Companion Object,在Java中,可以通过以下方式(使用反射)获取对静态方法的引用: 在Kotlin中,可以通过以下方式(使用反射)获取对实例方法的引用(类型KFunctionX): 我收到一个未解决的引用错误您需要指定您想要的伴生对象: val companionMethod = SomeJavaClass.Companion::someCompanionMethod 您需要指定您想要的伴生对象: val companionMethod = SomeJavaClass.Companion::someCompan

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

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


我收到一个未解决的引用错误

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

val companionMethod = SomeJavaClass.Companion::someCompanionMethod

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

val companionMethod = SomeJavaClass.Companion::someCompanionMethod
正如所建议的,当您不为同伴对象(未命名的同伴)提供名称时,默认情况下,它将获得
companion

因此,以下措施应该可以很好地发挥作用:

val companionMethod=SomeKotlinClass.Companion::someCompanionMethod
如果命名同伴对象,则可以使用其名称引用它:

class SomeKotlinClass{
名为{
有趣的someCompanionMethod(){…}
}
}
val companionMethod=SomeKotlinClass.Named::someCompanionMethod
编辑: 因为OP仍然不明白为什么
SomeKotlinClass::someCompanionMethod
不起作用。以下是解释:

当您从它调用函数时,仍然可以使用
.companion
引用companion,例如
SomeKotlinClass.companion.someCompanionMethod(…)

//这是有效的:)
val s=某个Kotlinclass
val companionMethod=s::testFunction
//但这并不是:(
val companionMethod=SomeKotlinClass::testFunction
嗯,这是因为
不能解析companion

为什么?因为如果它这样做,它将是不明确的,因为在companion和class中都可以定义相同名称的函数,所以它将无法区分它们

但在调用站点,编译器可以区分成员调用和伴随调用,因为当您不向伴随对象(未命名的伴随对象)提供名称时,您可以将伴随调用称为
SomeKotlinClass.testFunction()
instanceOfSomeKotlinClass.testFunction()

,默认情况下,它将获得
伴奏

因此,以下措施应该可以很好地发挥作用:

val companionMethod=SomeKotlinClass.Companion::someCompanionMethod
如果命名同伴对象,则可以使用其名称引用它:

class SomeKotlinClass{
名为{
有趣的someCompanionMethod(){…}
}
}
val companionMethod=SomeKotlinClass.Named::someCompanionMethod
编辑: 由于OP仍然感到困惑,为什么
SomeKotlinClass::someCompanionMethod
不起作用。下面是解释:

当您从它调用函数时,仍然可以使用
.companion
引用companion,例如
SomeKotlinClass.companion.someCompanionMethod(…)

//这是有效的:)
val s=某个Kotlinclass
val companionMethod=s::testFunction
//但这并不是:(
val companionMethod=SomeKotlinClass::testFunction
嗯,这是因为
不能解析companion

为什么?因为如果它这样做,它将是不明确的,因为在companion和class中都可以定义相同名称的函数,所以它将无法区分它们


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

谢谢。不过,有点令人惊讶的是,在调用方法时,我们不需要附带的关键字,在使用反射时,我们需要并且关键字应该以大写字母('C')开头…@Eitanos30 added ExplainationCapital-C
Companion
不是关键字。当您不提供名称时,它是Companion对象的默认名称。@Tenfour04,很高兴了解带大写字母C的Companion的事实。Thanks@AnimeshSahu,我不知道val s=SomeKotlinClass是有效的。很高兴知道。额外的解释有助于我犯了很多错误!我在尝试使用实例而不是类名时犯了另一个错误。如果您使用名称设置companion,您会编写什么来代替val s=SomeKotlinClass?谢谢。不过,令人有点惊讶的是,在调用方法时,我们不需要companion关键字,在使用反射时,我们需要它,同时还需要键单词应以大写字母(“C”)开头…@Eitanos30 added ExplainationCapital-C
Companion
不是关键字。当您不提供名称时,它是Companion对象的默认名称。@Tenfour04,很高兴了解带大写字母C的Companion的事实。Thanks@AnimeshSahu,我不知道val s=SomeKotlinClass是有效的。很高兴知道。额外的解释有助于我犯了很多错误!在尝试使用实例而不是类名时,我又犯了一个错误。如果您使用名称设置同伴,您会编写什么来代替val s=SomeKotlinClass?
    var companionMethod = SomeJavaClass::someCompanionMethod
val companionMethod = SomeJavaClass.Companion::someCompanionMethod