reflection - Kotlin 检查函数是否需要实例参数

标签 reflection kotlin kotlin-reflect

如果一个 KCallable使用 Any()::toString 创建然后当它稍后被引用时,您不需要传递 Any实例(使用 call 时)。

虽然如果它是使用 Any::toString 创建的(不是 Any 的实例)它需要通过 Any实例。

所以我的问题是如何轻松找出是否需要传递该实例参数以及该参数是否强制?

我找到了一种方法来做到这一点:
callable.parameters[0].kind == KParameter.Kind.INSTANCE
但这不是很好,我想知道是否有更简单或推荐的方法来解决这个问题。谢谢!

最佳答案

您建议的方法的改进是检查 instanceParameter 属性:如果它不为空,则可调用对象需要一个实例:

val isInstanceCallable = callable.instanceParameter != null

此外,fun Any.foo() = ... 等扩展功能instanceParameter 中将有 null ,您可能想查看 extensionReceiverParameter 也是。

此外,如果您只需要使用可调用引用,您可以检查它们是否具有绑定(bind)的接收器(即它绑定(bind)到的实例)。使用 boundReceiver 属性(property):
val instance = (callable as CallableReference).boundReceiver

当可调用引用未绑定(bind)时,它将返回一个特殊值 CallableReference.NO_RECEIVER ,因此您只需将返回的值与它进行比较:
val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER

(runnable example)

关于reflection - Kotlin 检查函数是否需要实例参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43822920/

相关文章:

intellij-idea - 如何让我的 JUnit 测试在我的 Kotlin+Gradle 项目中编译和运行?

kotlin - 对属性 setter 的方法引用

reflection - 如何在 Kotlin 中获取 KType?

.net - TypeOf子类的设计模式

reactjs - 如何使用 Gradle 将 Reason 和 Ktor 应用程序打包在一起?

java - RxJava 仅延迟部分流程的重复

Kotlin 类应该有一个无参数构造函数

c# - 调用对象方法而不考虑参数类型

Java - 从接口(interface)到实现的动态类转换

reflection - 如何强制解包存储为 Any 的可选字符串