Узнайте название метода в Groovy

Есть ли способ в Groovy узнать имя вызываемого метода?

<code>def myMethod() {
    println "This method is called method " + methodName
}
</code>

Это, в сочетании с утиной типизацией, позволило бы получить довольно лаконичный (и, вероятно, трудно читаемый) код.

 pchronz11 апр. 2012 г., 21:26
Спасибо, я не нашел этого!
 Ritesh M Nayak11 апр. 2012 г., 11:57
Посмотрите на эту тему.stackoverflow.com/questions/9540678/…

Ответы на вопрос(2)

Решение Вопроса

Нет, как и в случае с 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()

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

Ваш ответ на вопрос