由于每个Groovy对象都实现了GroovyObject接口,我会尝试覆盖invokeMethod(),这是我的测试:
class MyGrrovyClass {
static test(){
println 'i am in test'
}
Object invokeMethod(String name, Object args){
log.info('method intercepted')
def metaClass = InvokerHelper.getMetaClass(this)
def result = metaClass.invokeMethod(this, name, args)
return result
}
public static void main(String[] args) {
test()
}
}
但似乎不起作用,我从未在我的控制台中看到过日志消息
我的第二个问题是:GroovyInterceptable是GroovyObject的子接口,我直接覆盖GroovyObject的invokeMethod和实现GroovyInterceptable接口的invokeMethod之间的区别是什么?
感谢
答案 0 :(得分:4)
根据文档(http://groovy.codehaus.org/Using+invokeMethod+and+getProperty),您必须实现GroovyInterceptable来拦截现有方法,我认为这可以回答您的第一和第二个问题!
我做了一些小改动让你的示例类工作,虽然惊讶地看到我的println被截获但不是System.out.println - 这意味着我得到了一个堆栈溢出因为我最初有一个简单的println invokeMethod和递归调用。
class MyGrrovyClass implements GroovyInterceptable {
def test(){
println 'i am in test'
}
def invokeMethod(String name, args){
System.out.println('method intercepted: '+ name)
def result= metaClass.getMetaMethod(name, args).invoke(this, args)
}
}
def mgc= new MyGrrovyClass()
mgc.test()