如果一个 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/