2012-03-02 3 views
9

Я использую Groovy 1.8.4, пытаясь получить имя функции ограждающей ...Groovy, введите имя закрывающей функции?

def myFunction() { 
    println functionName?? 
} 

Я попытался delegate, this, owner, Groovy не жалуется нет таких объектов найдено.

Я также попытался Java хак new Exception().getStackTrace()[0].getMethodName(), но это просто печатает newInstance0

+0

Могу я спросить, что вы пытаетесь достичь с именем метода? –

+0

Трассировка вывода ... мы создаем POC, код часто меняется, у нас есть метод, который печатает заголовок, когда он запускает новую функцию, мы хотим, чтобы имя появилось из самой функции, а не передавало ее как аргумент в случае изменения имени функции – raffian

+0

В http://stackoverflow.com/a/9417763/190201 приведен пример, а также как получить текущий номер строки и имя файла. – ataylor

ответ

3

Вы можете добраться до него через StackTrace, я был в состоянии получить его с помощью:

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

да, но вам нужно угадать глубину stacktrace :), и это не гарантируется, чтобы оставаться постоянным с будущими потрясающими релизами –

+1

Чтобы скомпоновать код @doelerri s. Вы можете сделать что-то вроде этого: 'Thread.currentThread(). StackTrace.find {it.className.startsWith (" com.project ... ")}. MethodName'. Там вы можете делать все, что вам удобно, чтобы убедиться, что если глубина стека не останется постоянной, вы получите код. –

+0

@JarredOlson Разве это не просто хаки? Удивительный Groovy не предлагает такую ​​функцию – raffian

11

Как о Groovy, StackTraceUtils.sanitize? Вот простой пример:

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

Выход выше при вставке в автономный скрипт test.groovy выглядит следующим образом:

метод
$ 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 

Sanitize отфильтровывает все заводной внутренний фетиш из трассировки и чистый след вместе с ...stackTrace.find { } должен дать вам неплохой старт.

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

выход:

helloFun 
+1

, когда getCurrentMethodName() вызывается в закрытии, он покажет doCall(). то есть myArray.each {e -> println getCurrentMethodName(); } –

Смежные вопросы