Bookmark and Share
Document Actions

Come integrare
difficile

Un secondo metodo di integrazione, con qualche spiegazione in più e un piccolo esempio per capire meglio cosa stiamo facendo.

Come ? (il secondo metodo)

L'altro sistema (quello che verrà approfondito) invece si integra perfettamente con Java ma richiede la compilazione del codice.

Fortunatamente Jython ci permette di costruire delle classi compatibili (ed integrabili) con Java!! Bisogna però fare attenzione ad alcune limitazioni ed impostare la nostra classe secondo alcune regole.

In primo luogo faccio notare che, sebbene da Jython non ci sia alcun problema ad utilizzare classi Java, da Java non è possibile, senza questi accorgimenti, utilizzare classi Jython.

Java ha una politica di incapsulamento molto più rigida di Python: i metodi e gli attributi sono esposti all'esterno solo se dichiarati "Public". Inoltre riveste molta importanza la "signature" del metodo: l'insieme formato dal nome del metodo e di tutti gli argomenti passati (compresi i loro tipi).

Python, al contrario, non ha particolari vincoli sulla visibilità dei metodi e degli attributi (a parte l'utilizzo del doppio underscore). Tutti i metodi e gli attributi sono esposti. Inoltre la signature non tiene conto degli argomenti che, in Python, sono variabili e tipizzati dinamicamente.

Per far dialogare questi due ambienti è quindi necessario:

  1. definire la nostra classe python in un file (analogamente a quanto si fa per Java). E' possibile avere più classi per file ma sarà possibile esporne una sola;
  2. la classe deve essere imparentata con una classe Java. E' possibile anche che sia figlia di java.lang.Object;
  3. a questo punto la classe esporrà i metodi che sono pubblici nelle classi genitrici. Per rendere pubblici ulteriori metodi deve essere messa la signature java nella docstring del metodo (preceduta da @sig);
  4. non è possibile rendere pubblici gli attributi di una classe ma è possibile rendere pubblici i metodi getter e setter di ogni attributo;
  5. una volta pronta la nostra classe si può compilare con jythonc. Questo comando è incluso nell'installazione di Jython e si occupa di tradurre il nostro codice Python in Java, di compilarlo e di impacchettarlo in un jar. Il comando è anche dotato di alcune utili opzioni per includere nel jar l'interprete ottenendo quindi un jar autonomo.

Attenzione:

Per utilizzare Jythonc è ncessario utilizzare jdk (java developer kit). Le jre (java runtime environment) non sono sufficienti per eseguire la compilazione. Le jdk si trovano sul sito della Sun. Bisogna accertarsi che la versione di Java utilizzata da Jython sia quella delle jdk. Per fare questo è necessario controllare lo script che lancia Jython e modificarlo. Ad esempio su Windows ho dovuto modificare
 

"C:\Programmi\Java\jre6\bin\java.exe" -Dpython.home="C:\jython2.2.1" -classpath "C:\jython2.2.1\jython.jar;%CLASSPATH%" org.python.util.jython %ARGS%

in

"C:\Programmi\java\jdk1.5.0_17\bin\java.exe" -Dpython.home="C:\jython2.2.1" -classpath "C:\jython2.2.1\jython.jar;%CLASSPATH%" org.python.util.jython %ARGS%

 

Un esempio

Cominciamo con il più classico esempio: "Hello world".

Come prima cosa creo il mio file Hello.py con la mia classe:

class Hello(java.lang.Object):
    def __init__(self):
        self.name="" 
    def say(self):
        """@sig public java.lang.String say()"""
        return "hello %s" % self.name
    def getName(self):
        """@sig public java.lang.String getName()"""
        return self.name
    def setName(self,txt):
        """@sig public void setName(java.lang.String txt)"""
        self.name=txt

E' importante notare tre cose:

  1. la classe è figlia di una classe Java
  2. la doc string di alcuni metodi Python contengono la signature Java preceduta da "@sig"
  3. il tipo java String deve essere dichiarato per esteso (in Python non è importato implicitamente)

Una volta completato il mio file posso compilarlo con:

jythonc -p lupo --all -j Hello.jar Hello.py

Con l'opzione p indico il nome del package, l'opzione all include l'interprete nel jar, l'opzione j serve a dare il nome del jar.

Se la compilazione va a buon fine è possibile utilizzare questo jar da Java aggiungendolo alla classpath e importandolo in questo modo:

import lupo.Hello;

in seguito possiamo usarlo con:

saluto = new Hello();
saluto.setName("Maurizio");
System.out.println(saluto.say); 

 

 
by Maurizio Lupo last modified 2009-03-18 12:18