在groovy中获取闭包的内容

时间:2012-10-01 10:56:19

标签: groovy

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

def a = { assert 1 == 1 }

def method(def a)
{
    println a
}
method(a)

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

3 个答案:

答案 0 :(得分:5)

使用answer I linked to as a duplicate of this,如果您保存:

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 )

到文件test.groovy然后执行:

groovy test.groovy

你得到了输出:

{
assert 1 == 1 : null
return null
}

我认为哪个接近你想要...不使用code变量中的位置数据(Groovy Statement class)来获取行/列号和将文件解析为文本以将其解压缩...

答案 1 :(得分:1)

您正在寻找类似Javascript的功能,在函数上调用toString()会打印其源代码。

Groovy被编译为JVM字节码。 groovy编译器不会在编译的JVM类文件中保留源代码。

答案 2 :(得分:0)

在Odersky& Sons的“Scala编程”一书中,Scala中有一个着名的例子。有限公司

基本上,你必须:

  • 列出文件
  • 用于匹配* .groovy
  • 的每个文件
  • 修剪/ grep想要的行
<{3>}中的

,有一个Groovy方法directory.eachFileMatch,可以让您找到正确的文件,以及File.filterLine()方法,可以让您获取正确的行。