在Groovy中打印关闭定义/源
谁知道如何打印Groovy的关闭源?
例如,我有这个关闭(绑定到一个) def a = { it.twice() } 我想有字符串“it.twice()”或“{it.twice()}” 只是一个简单的toString ofcourse不行: a.toString(); //results in: Script1$_run_closure1_closure4_closure6@12f1bf0 解决方法
简短的答案是你不能.长的答案是:
取决于你需要的代码,你可能会逃避 // file: example1.groovy def a = { it.twice() } println a.metaClass.classNode.getDeclaredMethods("doCall")[0].code.text // prints: { return it.twice() } 但
和 // file: example2.groovy def 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.groovy def 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].code def 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].code println "$code.lineNumber $code.columnNumber $code.lastLineNumber $code.lastColumnNumber" new File('example1.groovy').readLines() ... etc etc you get the idea. 行号应该至少在原始代码附近 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |