Is there a way in Groovy to find out the name of the called method?
def myMethod() {
println "This method is called method " + methodName
}
This, in combination with duck typing would allow for quite concise (and probably hard to read) code.
No, as with Java there's no native way of doing this.
You could write an AST transform so that you could annotate the method and this could set a local variable inside the method.
Or you can do it the good old Java way of generating a stackTrace, and finding the correct StackTraceElement with something like:
import static org.codehaus.groovy.runtime.StackTraceUtils.sanitize
def myMethod() {
def name = sanitize( new Exception().fillInStackTrace() ).stackTrace.find {
!( it.className ==~ /^java_.*|^org.codehaus.*/ )
}?.methodName
println "In method $name"
}
myMethod()
Groovy supports the ability to intercept all methods through the invokeMethod
mechanism of GroovyObject.
You can override invokeMethod
which will essentially intercept all method calls (to intercept calls to existing methods, the class additionally has to implement the GroovyInterceptable
interface).
class MyClass implements GroovyInterceptable {
def invokeMethod(String name, args) {
System.out.println("This method is called method $name")
def metaMethod = metaClass.getMetaMethod(name, args)
metaMethod.invoke(this, args)
}
def myMethod() {
"Hi!"
}
}
def instance = new MyClass()
instance.myMethod()
Also, you can add this functionality to an existing class:
Integer.metaClass.invokeMethod = { String name, args ->
println("This method is called method $name")
def metaMethod = delegate.metaClass.getMetaMethod(name, args)
metaMethod.invoke(delegate, args)
}
1.toString()