Groovy - overriding invokeMethod for a single instance

groovy, metaprogramming

Solution

There might be a shorter route to the original method, but this should work:

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

Problem

I have an instance of a java object, let's say an instance of ArrayList called myList. For this particular instance, I want to override the invokeMethod method to (say) log that method was called. I could do something like this: ``` myList.metaclass.invokeMethod { name, args -> println "Called ${name} with ${args}" whatGoesHere.invokeMethod(name, args) } ``` Notice the 2nd line of the closure - how can I call the original invokeMethod method? Am I going about this correctly?

Original source

Related problems