例如,我有这个关闭(绑定到一个)
def a = { it.twice() }
我想有字符串“it.twice()”或“{it.twice()}”
只是一个简单的toString ofcourse不行:
a.toString(); //results in: Script1$_run_closure1_closure4_closure6@12f1bf0解决方法 简短的答案是你不能.长的答案是:
取决于你需要的代码,你可能会逃避
// file: example1.groovydef a = { it.twice() }println a.MetaClass.classNode.getDeclaredMethods("doCall")[0].code.text// prints: { return it.twice() }
但
您将需要类路径AT RUNTIME中可用脚本的源代码,如下所述
groovy.lang.MetaClass#getClassNode()
“Obtains a reference to the original
AST for the MetaClass if it is
available at runtime
@return The
original AST or null if it cannot be
returned”
和
文本技巧并不真正返回相同的代码,只是一个代码,如AST的表示,可以在这个脚本中看到
// file: example2.groovydef b = {p-> p.twice() * "p"}println b.MetaClass.classNode.getDeclaredMethods("doCall")[0].code.text// prints: { return (p.twice() * p) }
仍然,它可能是有用的,因为它是如果你只是想快速看看
而且,如果你手上有太多时间,不知道该怎么办,可以编写自己的org.codehaus.groovy.ast.GroovyCodeVisitor来打印它
或者,只是窃取一个现有的,像groovy.inspect.swingui.AstNodetoScriptVisitor
// file: example3.groovydef c = {w-> [1,2,3].each { println "$it" (1..it).each {x-> println 'this seems' << ' somewhat closer' << ''' to the original''' << " $x" } }}def node = c.MetaClass.classNode.getDeclaredMethods("doCall")[0].codedef writer = new StringWriter()node.visit new groovy.inspect.swingui.AstNodetoScriptVisitor(writer)println writer// prints: return [1,3].each({// this.println("$it")// return (1.. it ).each({ java.lang.Object x ->// return this.println('this seems' << ' somewhat closer' << ' to the \n original' << " $x")// })// })
现在.
如果你想要原始的,准确的,可运行的代码…你没有运气
我的意思是,你可以使用源代码行信息,但是上一次我检查,并不是真的让他们正确
// file: example1.groovy....def code = a.MetaClass.classNode.getDeclaredMethods("doCall")[0].codeprintln "$code.lineNumber $code.columnNumber $code.lastlineNumber $code.lastColumnNumber"new file('example1.groovy').readlines()... etc etc you get the IDea.
行号应该至少在原始代码附近
总结以上是内存溢出为你收集整理的在Groovy中打印关闭定义/源全部内容,希望文章能够帮你解决在Groovy中打印关闭定义/源所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)