groovy元类替换超类方法

时间:2012-05-07 14:09:35

标签: groovy metaprogramming metaclass

有没有办法使用元类对象替换,这是一个超类的方法。 例如:

class A {
    def doIt(){
        two()
        println 'do it!'
    }
    protected two(){   
        println 'two'
    }
}

class B extends A{
    def doLast(){
        doIt()
    }
}

B b = new B();
b.doIt()
/*
 * two
 * doit!
 */
b.metaClass.two = {
    println 'my new two!'
}
b.doIt();
/*
 * my new two!
 * do it!
 */

1 个答案:

答案 0 :(得分:7)

由于twodoIt在同一个类中声明,因此groovy将跳过此调用的元对象协议。您可以通过将超类标记为GroovyInterceptable来覆盖此行为,这会强制所有方法调用通过invokeMethod。例如:

class A implements GroovyInterceptable {
    def doIt(){
        two()
        println 'do it!'
    }
    protected two(){   
        println 'two'
    }
}

class B extends A {
    def doLast(){
        doIt()
    }
}

B b = new B()
b.doIt()  // prints two
b.metaClass.two = {
    println 'my new two!'
}
b.doIt() // prints my new two!