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

如果一个KCallable是使用Any()::toString创建的,那么当它被引用时,你不需要传递Any实例(当使用call )。

虽然如果它是使用Any::toString (不是Any一个实例)创建的,它需要传递一个Any实例。

所以我的问题是如何轻松地找出是否需要传递该实例参数,并且此参数是必需的?

我find了一个方法来做到这一点:

callable.parameters[0].kind == KParameter.Kind.INSTANCE

但它不是很好,我想知道是否有一个更容易或推荐的方法来解决这个问题。 谢谢!

你提出的方法的一个改进是检查instanceParameter属性:如果它不是null,那么可调用期望一个实例:

 val isInstanceCallable = callable.instanceParameter != null 

另外, fun Any.foo() = ...这样的扩展函数在instanceParameter会有null,你也可能想检查extensionReceiverParameter


另外,如果您只需要使用可调用的引用,就可以检查它们是否有绑定的接收者(即绑定的实例)。 使用boundReceiver属性:

 val instance = (callable as CallableReference).boundReceiver 

当可调用的引用被解除绑定时,它将返回一个特殊的值CallableReference.NO_RECEIVER ,因此您只需要将返回的值与它进行比较:

 val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER 

(可运行的例子)