Groovy,获取封闭函数的名称?

wlzqhblo  于 2022-11-01  发布在  其他
关注(0)|答案(5)|浏览(153)

我正在使用Groovy1.8.4,尝试获取封闭函数的名称...

def myFunction() {
  println functionName??
}

我尝试了delegatethisowner,Groovy抱怨没有找到这样的对象。
我还尝试了Java hack new Exception().getStackTrace()[0].getMethodName(),但它只打印newInstance0

6yjfywim

6yjfywim1#

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
qlckcl4x

qlckcl4x2#

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方法从跟踪中过滤掉所有Groovy内部的胡言乱语,干净的跟踪和...stackTrace.find { }应该会给予您一个不错的开始。

zmeyuzjn

zmeyuzjn3#

您可以通过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
smdncfj3

smdncfj34#

@CompileStatic
class LogUtils {
    // can be called the Groovy or Java way
    public static String getCurrentMethodName(){
        StackTraceElement[] stackTrace = StackTraceUtils.sanitize(new Throwable()).stackTrace
        stackTrace[2].methodName != 'jlrMethodInvoke' ? stackTrace[2].methodName : stackTrace[3].methodName
    }
}
eufgjt7s

eufgjt7s5#

今天有几种方法可以做到这一点。
请参阅:https://www.baeldung.com/java-name-of-executing-method
在我的案例中,最有效的方法是:
new Object(){}.getClass().getEnclosingMethod().getName();

相关问题