我是Groovy的新手。我想实现这个目标:
def a = { assert 1 == 1 }
def method(def a)
{
println a
}
method(a)
println
现在打印ConsoleScript1$_run_closure1@72e9108f
。但我希望它会打印assert 1 == 1
。那可能吗?
答案 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方法directory.eachFileMatch
,可以让您找到正确的文件,以及File.filterLine()
方法,可以让您获取正确的行。