4

我使用 GroovyShell 类创建了一个 groovy 引擎。然后我用“评估”方法运行了一堆语句。
有没有办法捕捉引擎的输出,这样我就可以获得“println”调用输出?
目前它进入标准输出,尽管它是一个摇摆应用程序。

4

2 回答 2

2

您可以将自定义 Writer(例如 StringWriter)分配给out绑定中的属性并将其传递给 GroovyShell。

def binding = new Binding();
binding.setProperty("out", new YourWriter())
new GroovyShell(binding);
于 2016-03-02T17:31:29.750 回答
1

您可以scriptBaseClass使用println方法设置 a ,并且您可以在该值之上自由操作。请记住,用户仍然可以这样做System.out.println,但如果需要,您可以将其列入黑名单。

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" )
于 2013-07-22T11:53:05.670 回答