2012-03-02 17 views
9

estoy usando Groovy 1.8.4, tratando de obtener el nombre de la función de cerramiento ...Groovy, obtén el nombre de la función adjunta

def myFunction() { 
    println functionName?? 
} 

He intentado delegate, this, owner, Groovy se queja hay tales objetos encontrados.

También probé el Java truco new Exception().getStackTrace()[0].getMethodName(), pero que sólo imprime newInstance0

+0

¿Puedo preguntar lo que estamos tratando de lograr con el nombre del método? –

+0

Seguimiento de salida ... estamos construyendo un POC, el código está cambiando con frecuencia, tenemos un método que imprime un encabezado cuando comienza una nueva función, queremos que el nombre provenga de la función en vez de pasarlo como un argumento en caso de que el nombre de la función cambie – raffian

+0

Hay un ejemplo en http://stackoverflow.com/a/9417763/190201 y también cómo obtener el número de línea actual y el nombre del archivo. – ataylor

Respuesta

3

Se puede llegar a ella a través del StackTrace, he sido capaz de hacerlo a través de:

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í, pero tienes que adivinar la profundidad de stacktrace :) y no está garantizado que se mantenga constante con futuras versiones groovy –

+1

Para construir fuera del código de @doelerri. Podría hacer algo como esto: 'Thread.currentThread(). StackTrace.find {it.className.startsWith (" com.project ... ")}. MethodName'. Allí puedes hacer lo que sea que te sientas cómodo para asegurarte de que si la profundidad de la stack stack no se mantiene constante, obtendrás tu código. –

+0

@JarredOlson ¿No son estos solo hacks? Sorprendente Groovy no ofrece esa característica – raffian

11

¿Qué hay de Groovy StackTraceUtils.sanitize? Aquí hay un ejemplo rápido:

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

La salida de los anteriores cuando se peguen en un proceso independiente test.groovy es el siguiente:

método
$ 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 

la esterilice filtra todos maravilloso jerigonza interna de la traza y la limpiar el rastro junto con ...stackTrace.find { } debería darle un comienzo 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() 

de salida:

helloFun 
+1

cuando se llama a getCurrentMethodName() en un cierre, se mostrará doCall(). es decir, myArray.each {e -> println getCurrentMethodName(); } –

Cuestiones relacionadas