在Groovy中打印关闭定义源

在Groovy中打印关闭定义源,第1张

概述谁知道如何打印Groovy的关闭源? 例如,我有这个关闭(绑定到一个) def a = { it.twice() } 我想有字符串“it.twice()”或“{it.twice()}” 只是一个简单的toString ofcourse不行: a.toString(); //results in: Script1$_run_closure1_closure4_closure6@12f1bf0 简短的 谁知道如何打印Groovy的关闭源?

例如,我有这个关闭(绑定到一个)

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中打印关闭定义/源所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243810.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存