我正在使用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如何查找要调用的方法?
答案 0 :(得分:0)
嗯,层次结构是预期的面向对象编程方法重载,这是你目睹的。不同之处在于调度。它不是从实例类中的方法查找开始,而是从MOP(元对象协议)开始。
在外行人的术语中,因为MOP是可编程的,所以调用方法的方式也是如此:)
Groovy的documentation中的下图显示了如何查找方法。
图中不清楚的是,还有一个实例元类,它出现在类的元类之前。
可能有用的东西是查看对象或类的.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"