我使用GroovyShell类创建了一个groovy引擎。
然后我用“评估”方法运行一堆语句
有没有办法捕获引擎的输出,所以我可以得到“println”调用输出?
目前它是stdout,虽然它是一个摇摆应用程序。
答案 0 :(得分:2)
您可以将自定义Writer(例如StringWriter)分配给绑定中的out
属性,并将其传递给GroovyShell。
def binding = new Binding();
binding.setProperty("out", new YourWriter())
new GroovyShell(binding);
答案 1 :(得分:1)
您可以使用scriptBaseClass
方法设置println
,并且您可以在值的基础上自由操作。请注意,如果需要,用户仍然可以System.out.println
,you can blacklist。
import org.codehaus.groovy.control.CompilerConfiguration
def script = """
a = 10
println a
println "echo"
"""
abstract class Printer extends Script {
void println(obj) {
this.binding.printed << obj
}
}
def config = new CompilerConfiguration(scriptBaseClass: Printer.class.name)
def binding = new Binding([printed: []])
new GroovyShell(this.class.classLoader, binding, config).evaluate script
assert binding.variables.printed.contains( 10 )
assert binding.variables.printed.contains( "echo" )