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

时间:2017-05-06 16:40:29

标签: reflection kotlin kotlin-reflect

如果使用KCallable创建Any()::toString,则稍后引用时,您无需传递Any实例(使用call时)。

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

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

我找到了一种方法:

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

但它不是很好,我想知道是否有一种更简单或推荐的解决方法。谢谢!

1 个答案:

答案 0 :(得分:1)

您建议的方法的改进是检查instanceParameter属性:如果它不为null,则callable需要一个实例:

val isInstanceCallable = callable.instanceParameter != null

此外,fun Any.foo() = ...等扩展功能在instanceParameter中将为空,您可能也想检查extensionReceiverParameter

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

val instance = (callable as CallableReference).boundReceiver

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

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

(runnable example)