方法调用在groovy中以哪种顺序工作?

时间:2015-09-04 19:50:10

标签: groovy metaprogramming metaclass

我正在使用groovy 2.3.8

我试图找出方法调用如何在groovy中工作。具体来说,如果我们有一个Java类层次结构,每个层次结构都有metaClass,如下所示

class A {
}
A.metaClass.hello = {
  "hello superclass"
}

class B extends A {
}
B.metaClass.hello = {
  "hello subclass"
}

如果我使用new B().hello(),我会获得hello subclass。如果我删除了B的元类,那么我得到hello superclass

基于改变上面的例子,我认为groovy按以下顺序排列,以找到要调用的方法

method-in-subclass's-metaclass ?: subclass-metho  ?: method-in-superclass's metaclass ?: method-in-superclass

那么groovy如何查找要调用的方法?

1 个答案:

答案 0 :(得分:0)

嗯,层次结构是预期的面向对象编程方法重载,这是你目睹的。不同之处在于调度。它不是从实例类中的方法查找开始,而是从MOP(元对象协议)开始。

在外行人的术语中,因为MOP是可编程的,所以调用方法的方式也是如此:)

工作原理

Groovy的documentation中的下图显示了如何查找方法。

Groovy method dispatching for Groovy objects

图中不清楚的是,还有一个实例元类,它出现在类的元类之前。

可能有用的东西是查看对象或类的.metaClass.methods通过继承,特征,元类等添加的方法列在平面列表中。继承层次结构是扁平化的。另一方面,.metaClass.metaMethods似乎包含通过GDK添加的方法。从列表中我无法判断方法优先级:(

根据观察,规则似乎是这样的:最后一个MetaClass站立胜利。

class A { }

class B extends A { }

A.metaClass.hello = {
  "hello superclass"
}

B.metaClass.hello = {
  "hello subclass"
}

def b = new B()

assert b.hello() ==  "hello subclass"
b.metaClass = A.metaClass
assert b.hello() ==  "hello superclass"