sábado, 30 de janeiro de 2010

Executando código compilado Python no Java (JSR-223)

A biblioteca Jython implementa as especificações da API Java Scripting (JSR-223) e por isso, permite compilar código python para execução futura. Para isso, a implementação da interface javax.script.ScriptEngine fornecida pela Jython também implementa a interface javax.script.Compilable que fornece dois métodos para compilar o código fonte python que são:

public CompiledScript compile(String script) throws ScriptException;
public CompiledScript compile(Reader script) throws ScriptException;

Esses dois métodos permite compilar um código fonte em forma de java.lang.String ou java.io.Reader e com isso, retorna-se um objeto da classe abstrata javax.script.CompiledScript que permite fazer as chamadas aos métodos para executar o código compilado fonte como os seguintes métodos:

public Object eval() throws ScriptException
public Object eval(Bindings bindings) throws ScriptException
public abstract Object eval(ScriptContext context) throws ScriptException

Abaixo temos um código exemplo de como funciona a compilação de código fonte Python no Java.

---------------------------------------------------------------------------------------

import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class PythonCompileTest {

/**
* @param args
*/
public static void main(String[] args) {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager
.getEngineByName("python");

if (scriptEngine != null) {

if (scriptEngine instanceof Compilable) {
Compilable compilable = (Compilable) scriptEngine;

CompiledScript compiledScript = null;

try {
compiledScript = compilable
.compile("a = [] \nprint 'oi jython!!!'");

} catch (ScriptException e) {
e.printStackTrace();
}

if (compiledScript != null) {

try {
compiledScript.eval();

} catch (ScriptException e) {
e.printStackTrace();
}
}
}
}

System.out.println("Terminado com sucesso!!");
}
}

---------------------------------------------------------------------------------------

Nenhum comentário:

Postar um comentário