Groovy:在一个类的元类上添加方法时,如何设置闭包的委托?

时间:2014-10-02 06:07:41

标签: dynamic groovy

在下面的代码中,delegate引用了调用闭包的List实例。怎么设置?

List.metaClass.removeRight = { int index ->
    delegate.remove(delegate.size() - 1 - index)
}

2 个答案:

答案 0 :(得分:1)

Here是关于该主题的好文章。特别是 Closures和ExpandoMetaClass 部分。

我认为thisownerConsoleScript7@5e3eed51,因为它是,其中声明了闭包。 为什么委托等于列表实例在上述文章中有详细描述。每个类都有一个围绕它的 ExpandoMetaClass 实例。这使得元编程(例如,添加方法,即使类标记为最终)也是如此,因为正在将方法添加到EMC中,该方法拦截了调用。一个呼叫首先命中EMC,但它也需要访问包围的实例,这就是委托被设置为包围实例的原因。

调用添加的方法时,

delegate完全设置在this(第77行)类中。对于您添加的ClosureMetaMethod实例的方法已创建并在MOP中注册。调用它时,委托被设置为传入的对象,它被调用。这对你来说现在清楚了吗?

答案 1 :(得分:1)

MOP负责将方法调用分派给闭包。它(MOP)从metaClass检索闭包,克隆它,将委托设置为调用该方法的对象,然后调用闭包。