Groovyで呼び出されたメソッドの名前を見つける方法はありますか?
def myMethod() {
println "This method is called method " + methodName
}
これをダックタイピングと組み合わせると、非常に簡潔な (そしておそらく読みにくい) コードが可能になります。
Groovyで呼び出されたメソッドの名前を見つける方法はありますか?
def myMethod() {
println "This method is called method " + methodName
}
これをダックタイピングと組み合わせると、非常に簡潔な (そしておそらく読みにくい) コードが可能になります。
invokeMethod
Groovy は、 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()
いいえ、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()