4

Groovyで呼び出されたメソッドの名前を見つける方法はありますか?

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

これをダックタイピングと組み合わせると、非常に簡潔な (そしておそらく読みにくい) コードが可能になります。

4

2 に答える 2

9

invokeMethodGroovy は、 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()
于 2012-04-11T20:12:26.070 に答える
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()
于 2012-04-11T10:00:16.800 に答える