无法覆盖从GroovyObject继承的invokeMethod

时间:2013-07-03 09:09:29

标签: groovy metaprogramming

由于每个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之间的区别是什么?

感谢

1 个答案:

答案 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()