2

由于每个 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 有什么区别?

谢谢

4

1 回答 1

4

根据文档(http://groovy.codehaus.org/Using+invokeMethod+and+getProperty),您必须实施 GroovyInterceptable 来拦截现有方法我认为这回答了您的第一个和第二个问题!

我做了一些细微的更改以使您的示例类正常工作,尽管惊讶地发现我的 println 被拦截但没有 System.out.println - 这意味着我遇到了堆栈溢出,因为我最初在 invokeMethod 中有一个简单的 println 并且被递归调用。

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()
于 2013-07-03T09:55:56.827 回答