在groovy中获取闭包的内容

sri*_*ram 2 groovy

我是Groovy的新手.我想实现这个目标:

def a = { assert 1 == 1 }

def method(def a)
{
    println a
}
method(a)
Run Code Online (Sandbox Code Playgroud)

println现在打印ConsoleScript1$_run_closure1@72e9108f.但我希望它会打印出来assert 1 == 1.那可能吗?

tim*_*tes 6

使用我链接答案作为副本,如果你保存:

import groovy.inspect.swingui.AstNodeToScriptVisitor

def a = { assert 1 == 1 }

def method( def a ) {
  new StringWriter().with { writer ->
    a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.visit new AstNodeToScriptVisitor( writer )
    println "{\n$writer}"
  }
}

method( a )
Run Code Online (Sandbox Code Playgroud)

到文件test.groovy然后做:

groovy test.groovy
Run Code Online (Sandbox Code Playgroud)

你得到输出:

{
assert 1 == 1 : null
return null
}
Run Code Online (Sandbox Code Playgroud)

我认为这就像你要接近的那样......没有使用code变量中的位置数据 (这是一个Groovy语句类)来获取行/列号并将文件解析为文本以提取它. .

  • 你可以把闭包作为String传递,然后使用像'Eval.me`之类的东西来评估字符串(并运行它)吗?然后你有一个闭包,以及制作它的String ... (3认同)