Groovy MetaProgramming - 如何覆盖类的所有方法

时间:2013-04-04 09:44:17

标签: reflection groovy metaprogramming

我想以通用方式包装类的所有方法。所以我假设我不知道该类正在实现的方法,而AOP不是替代方法。

Groovy元编程允许甚至使用参数重新定义方法,但是当您从反射中获取参数列表时如何执行此操作。

someClass.metaClass.methods.each { method ->
    someClass.metaClass.'${method.name}' =  { /* how to define parameters knowing I get them from method.parameterTypes */

    }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

invokeMethod怎么样?

更新:正如@Tim所述,您可以使用getMetaMethod执行旧方法:

class A {
  def methodA(String a) { "executing methodA..." }
  def methodB(String b, Float c) {}
  def methodC() {}
}

A.metaClass.invokeMethod = { String method, args ->
  def ret = delegate.class.metaClass.getMetaMethod(method, args)?.invoke( delegate, args )
  "[intercepted $method] $ret"
}

def a = new A()

assert a.methodA("a") == "[intercepted methodA] executing methodA..."