sábado, 23 de janeiro de 2010

Acessando variáveis do Python no Java

Para acessar variáveis do Python no Java basicamente usamos o método "get" da interface javax.script.ScriptEngine. Esse método, retorna um java.lang.Object cujo tipo está relacionado ao tipo usado no Python. Veja o exemplo abaixo:

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

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

/**
*
*/
public class PythonToJava {

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

if(scriptEngine != null) {

try {
scriptEngine.eval("a=3 \nb=3.45 \nc=u'hello jython' \nd=3, 4, 5 \ne=[] \nf={}");

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

Object object[] = new Object[6];

object[0] = scriptEngine.get("a");
object[1] = scriptEngine.get("b");
object[2] = scriptEngine.get("c");
object[3] = scriptEngine.get("d");
object[4] = scriptEngine.get("e");
object[5] = scriptEngine.get("f");

for (int i = 0; i < object.length; i++) {
System.out.println("object[" + i + "]: " + object[i].getClass());
}
}

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

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

Se o Jython, Java e Python estiverem instalados corretamente, veremos a seguinte saída no console:


-----------------------------------------------------------------------------------
object[0]: class java.lang.Integer
object[1]: class java.lang.Double
object[2]: class java.lang.String
object[3]: class org.python.core.PyTuple
object[4]: class org.python.core.PyList
object[5]: class org.python.core.PyDictionary
Terminado com sucesso!!
-----------------------------------------------------------------------------------

O objeto "object[0]" retornado equivale ao tipo java.lang.Integer que é uma classe empacotadora de inteiros.

O objeto "object[1]" retornado equivale ao tipo java.lang.Double que é uma classe empacotadora de número de ponto flutuante de precisão dupla.

O objeto "object[2]" retornado equivale ao tipo java.lang.String que é uma cadeia de caracteres unicode.

O objeto "object[3]" retornado equivale ao tipo org.python.core.PyTuple que é uma classe que implementa a interface java.util.List. Mas, lembrando que esse tipo equivale ao tipo "tuple" no Python que é uma lista somente no modo leitura. Portanto, ao usar os métodos "add", "addAll", "clear", "remove", "removeAll", "retainAll" e "set" da interface java.util.List sobre a implementação org.python.core.PyTuple, retorna uma exceção java.lang.UnsupportedOperationException indicando que a operação não é suportada, pois tenta alterar a lista (org.python.core.PyTuple). Portanto, só deve ser usado os métodos de "leitura" da classe java.util.List.

O objeto "object[4]" retornado equivale ao tipo org.python.core.PyList que é uma classe que implementa a interface java.util.List.

O objeto "object[5]" retornado equivale ao tipo org.python.core.PyDictionary que é uma classe que implementa a interface java.util.concurrent.ConcurrentMap que por sua vez implementa a interface java.util.Map.


Veja na figura abaixo o mapeamento dos objetos Python para o Java.

Nenhum comentário:

Postar um comentário