2012-03-02 24 views
9

sto usando Groovy 1.8.4, cercando di ottenere il nome della funzione che racchiude ...Groovy, ottieni il nome della funzione in allegato?

def myFunction() { 
    println functionName?? 
} 

Ho provato delegate, this, owner, Groovy lamenta tali oggetti trovati.

Ho anche provato il Java mod new Exception().getStackTrace()[0].getMethodName(), ma che si limita a stampare newInstance0

+0

Posso chiedere cosa si sta cercando di realizzare con il nome del metodo? –

+0

Traccia output ... stiamo costruendo un POC, il codice sta cambiando frequentemente, abbiamo un metodo che stampa un'intestazione quando avvia una nuova funzione, vogliamo che il nome provenga dalla funzione stessa invece di passarla come un argomento nel caso in cui il nome della funzione cambi – raffian

+0

C'è un esempio in http://stackoverflow.com/a/9417763/190201 e come ottenere il numero di riga corrente e il nome del file. – ataylor

risposta

3

Si può raggiungere tramite lo stacktrace, sono stato in grado di farlo tramite:

groovy:000> def foo() { println Thread.currentThread().stackTrace[10].methodName } 
===> true 
groovy:000> foo() 
foo 
groovy:000> class Foo {                
groovy:001> def bar() { println Thread.currentThread().stackTrace[10].methodName } 
groovy:002> } 
===> true 
groovy:000> new Foo().bar() 
bar 
+4

sì, ma devi indovinare la profondità dello stacktrace :) e non è garantito che rimanga costante con le versioni groovy future –

+1

Per costruire il codice @doelerri. Si potrebbe fare qualcosa del genere: 'Thread.currentThread(). StackTrace.find {it.className.startsWith (" com.project ... ")}. MethodName'. Qui puoi fare tutto ciò che ti conviene per assicurarti che se la profondità dello stacktrace non è coerente, otterrai il tuo codice. –

+0

@JarredOlson Non sono solo questi hack? Sorprendente Groovy non offre questa caratteristica – raffian

11

Come circa groove di StackTraceUtils.sanitize? Ecco un breve esempio:

import org.codehaus.groovy.runtime.StackTraceUtils 

class A { 
    def methodX() { 
    methodY() 
    } 

    def methodY() { 
    methodZ() 
    } 

    def methodZ() { 
    def marker = new Throwable() 
    StackTraceUtils.sanitize(marker).stackTrace.eachWithIndex { e, i -> 
     println "> $i ${e.toString().padRight(30)} ${e.methodName}" 
    } 
    } 

} 

new A().methodX() 

L'uscita del sopra quando vengono incollati in uno script locale test.groovy è il seguente:

metodo
$ groovy test.groovy 
> 0 A.methodZ(test.groovy:13)  methodZ 
> 1 A.methodY(test.groovy:9)  methodY 
> 2 A.methodX(test.groovy:5)  methodX 
> 3 A$methodX.call(Unknown Source) call 
> 4 test.run(test.groovy:21)  run 

il sanitize filtra tutti scanalato jumbo mumbo interno dalla traccia e la traccia pulita insieme a ...stackTrace.find { } dovrebbe darti una partenza decente.

11
import org.codehaus.groovy.runtime.StackTraceUtils 

def getCurrentMethodName(){ 
    def marker = new Throwable() 
    return StackTraceUtils.sanitize(marker).stackTrace[1].methodName 
} 

def helloFun(){ 
    println(getCurrentMethodName()) 
} 

helloFun() 

uscita:

helloFun 
+1

quando viene chiamato getCurrentMethodName() in una chiusura, mostrerà doCall(). ad esempio myArray.each {e -> println getCurrentMethodName(); } –

Problemi correlati