Java 如何通过refelection获取伴随方法引用(KFunction<;>;)
在Java中,可以通过以下方式(使用反射)获取对静态方法的引用: 在Kotlin中,可以通过以下方式(使用反射)获取对实例方法的引用(类型KFunctionX):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
我收到一个未解决的引用错误您需要指定您想要的伴生对象:
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-CCompanion
不是关键字。当您不提供名称时,它是Companion对象的默认名称。@Tenfour04,很高兴了解带大写字母C的Companion的事实。Thanks@AnimeshSahu,我不知道val s=SomeKotlinClass是有效的。很高兴知道。额外的解释有助于我犯了很多错误!我在尝试使用实例而不是类名时犯了另一个错误。如果您使用名称设置companion,您会编写什么来代替val s=SomeKotlinClass?谢谢。不过,令人有点惊讶的是,在调用方法时,我们不需要companion关键字,在使用反射时,我们需要它,同时还需要键单词应以大写字母(“C”)开头…@Eitanos30 added ExplainationCapital-CCompanion
不是关键字。当您不提供名称时,它是Companion对象的默认名称。@Tenfour04,很高兴了解带大写字母C的Companion的事实。Thanks@AnimeshSahu,我不知道val s=SomeKotlinClass是有效的。很高兴知道。额外的解释有助于我犯了很多错误!在尝试使用实例而不是类名时,我又犯了一个错误。如果您使用名称设置同伴,您会编写什么来代替val s=SomeKotlinClass?
var companionMethod = SomeJavaClass::someCompanionMethod
val companionMethod = SomeJavaClass.Companion::someCompanionMethod