Вопрос по introspection, reflection, groovy – Узнайте название метода в Groovy

4

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

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

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

Посмотрите на эту тему.stackoverflow.com/questions/9540678/… Ritesh M Nayak
Спасибо, я не нашел этого! pchronz

Ваш Ответ

2   ответа
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()
9

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

Похожие вопросы