2013-07-22 2 views
3

Я создаю отличный движок с классом GroovyShell. Затем я запускаю кучу операторов с помощью метода «оценки».
Есть ли способ поймать выход двигателя, чтобы я мог получить вывод «println»?
В настоящее время он переходит на стандартный вывод, хотя это приложение для качания.Как поймать выход GroovyShell?

ответ

2

Вы можете просто присвоить свой собственный Writer (например. StringWriter) в out собственности в связывании и передать его в GroovyShell.

def binding = new Binding(); 
binding.setProperty("out", new YourWriter()) 
new GroovyShell(binding); 
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") 
+0

Thanks. Так как я делаю это из java-кода, знаете ли вы, как определить класс принтера (код Java)? –

+0

Поскольку вы пишете 'Принтер' на Java, у вас возникают проблемы с' this.binding'? – Will

+0

Спасибо, я это понял. –

Смежные вопросы