2012-04-11 106 views
4

Groovy中有找到被調用方法的名稱的方法嗎?在Groovy中查找方法的名稱

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

這與鴨子打字相結合將允許非常簡潔(可能難以閱讀)的代碼。

+0

看看這個線程。 http://stackoverflow.com/questions/9540678/groovy-get-enclosing-functions-name – 2012-04-11 09:57:20

+0

謝謝,我還沒有找到這一個! – pchronz 2012-04-11 19:26:56

回答

4

不,與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() 
9

Groovy支持攔截通過invokeMethod機制的GroovyObject的所有方法的能力。

您可以覆蓋invokeMethod,它將基本上攔截所有方法調用(攔截對現有方法的調用,此類還必須實現接口)。

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