找出一个方法的在Groovy名(Find out a method's name in Gr

2019-06-23 12:36发布

有没有在Groovy的方式,找出所调用的方法的名字吗?

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

这与鸭打字组合将允许相当简洁(也可能难以阅读)的代码。

Answer 1:

不,与Java有这样做的没有原生的方式。

你可以写一个AST转换,让你可以注释方法,这可能设置方法中的局部变量。

或者你也可以做到这一点产生一个堆栈跟踪,并与像找到正确的StackTraceElement的好老的Java方法:

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


Answer 2:

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

您可以覆盖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()


文章来源: Find out a method's name in Groovy