Groovy - 覆盖单个实例的invokeMethod

时间:2012-04-12 14:40:28

标签: groovy metaprogramming

我有一个java对象的实例,假设有一个名为myList的ArrayList实例。

对于这个特定的实例,我想要将invokeMethod方法覆盖到(比方说)log方法被调用。

我可以这样做:

myList.metaclass.invokeMethod { name, args -> 

   println "Called ${name} with ${args}"
   whatGoesHere.invokeMethod(name, args)

}

注意闭包的第二行 - 如何调用原始的invokeMethod方法?我能正确地解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

原始方法的路线可能较短,但这应该有效:

def myList = [ 1, 2, 3 ]

myList.metaClass.invokeMethod { name, args -> 
   println "Called ${name} with ${args}"
   delegate.class.metaClass.getMetaMethod( name, args )?.invoke( delegate, args )
}

myList.sum()