如何访问方法引用的接收者?

问题描述 投票:0回答:1

我有一个方法参考(由

kotlin.reflect.KFunction0
接口表示)。我想做的是获取方法引用的
receiver
对象。

例如:

data class MyClass(val name: String)

val john = MyClass("John")
val methodReference = john::toString

methodReference.receiver // doesn't work!

receiver
methodReference
是物体
john
。如果我查看 IntelliJ 调试器,
methodReference
有一个
receiver
字段,它确实指向
john
。但我找不到在我的代码中实际访问它的方法。

有某种解决方法吗?

kotlin reflection method-reference kotlin-reflect
1个回答
0
投票

假设这是 Kotlin/JVM,您看到的

receiver
字段是在
CallableReference
中声明的受保护字段。您可以使用 Java 反射来获取它。

val f = someINstance::foo
val receiverField = CallableReference::class.java.getDeclaredField("receiver")
receiverField.isAccessible = true
println(receiverField.get(f))

我不确定这个字段是否保证被称为

receiver
,或者在未来的版本中是否会存在。我找不到这方面的任何官方文档。

另请注意,并非每个

KFunction0
都有接收器。

© www.soinside.com 2019 - 2024. All rights reserved.