ras*_*cio 6 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!
*/
Run Code Online (Sandbox Code Playgroud)
由于two和doIt在同一个类中声明,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!
Run Code Online (Sandbox Code Playgroud)