我有一个方法参考(由
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/JVM,您看到的
receiver
字段是在 CallableReference
中声明的受保护字段。您可以使用 Java 反射来获取它。
val f = someINstance::foo
val receiverField = CallableReference::class.java.getDeclaredField("receiver")
receiverField.isAccessible = true
println(receiverField.get(f))
我不确定这个字段是否保证被称为
receiver
,或者在未来的版本中是否会存在。我找不到这方面的任何官方文档。
另请注意,并非每个
KFunction0
都有接收器。