在Groovy中找出方法的名称

时间:2012-04-11 09:43:52

标签: reflection groovy introspection

Groovy中有没有办法找出被调用方法的名称?

def myMethod() {
    println "This method is called method " + methodName
}

这与鸭子打字相结合将允许非常简洁(并且可能难以阅读)的代码。

2 个答案:

答案 0 :(得分:9)

Groovy支持通过GroovyObject的invokeMethod机制拦截所有方法的能力。

您可以覆盖invokeMethod,这将基本上拦截所有方法调用(为了拦截对现有方法的调用,该类还必须实现GroovyInterceptable接口)。

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

此外,您可以将此功能添加到现有类:

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

答案 1 :(得分:4)

不,与Java一样,没有本地方法可以做到这一点。

您可以编写AST变换,以便可以对方法进行注释,这可以在方法中设置局部变量。

或者您可以使用旧的Java方法生成stackTrace,并使用以下内容找到正确的StackTraceElement:

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