2

クラスのすべてのメソッドを一般的な方法でラップしたいと思います。したがって、クラスが実装しているメソッドがわからず、AOP は代替手段ではないと思います。

Groovy メタプログラミングでは、パラメーターを使用してもメソッドを再定義できますが、リフレクションからパラメーターのリストを取得するときにそれを行う方法。

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

    }
}

助けてくれてありがとう。

4

1 に答える 1

4

どう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..."
于 2013-04-04T11:48:50.540 に答える