這一章主要是在講 Jython 跟 Java 合在一起使用的合體技。

第一個合體技是 BuildingFactory,主要是寫一個 factory 類別來專門產生 Python 程式裡的物件,在 Python 程式裡的物件都會是 Python Object,這裡使用了 PyObject 的 __tojava__ 函式,將 python engine 產生出來的物件轉換為 java 可直接用的物件。

如果今天又多了一些類別,照前面的方法就會改死,接下來作者就是改良前一個的做法。他的做法就是只傳入必要的型別參數,讓 createObject() 知道怎麼去轉換 (__tojava__()) ,然後傳回 Object,給使用的人自行去做轉換。另外原先的 BuildingType 也避免在 ctor 裡放參數,這樣就可以讓 createObject() 裡的程式簡單化,有需要設置屬性的,就呼叫 BuildingType 的 getter/setter 去設定即可。

第3個版本又做了一些調整與改善,主要是引入了 PySystemState 跟 Py。

接著提到 __doc__ ,這個其實前面都已經做完了,在 PyObject 轉換為 Java 物件的同時,會提供一個 getDoc() 方法,用這個就可以取得在 python 程式裡的 __doc__。

Applying the design to different object type 這一節直接給了一個範例,這個範例主要是引用了 PlyJy 這個 module,並不是使用之前所定義的 Factory 類別。

這邊有提到歷史,說 jython 2.5 之前,裡面有包個 jythonc 的程式,可以把 python 程式轉為 java,再編譯為 .jar,在編譯的同時,介面、類別的定義都會被固定下來,那 java 程式就可以直接引用,不需要另外處理。到了 2.5 之後就不建議使用這種方式,也不再包這個程式。

透過 JSR-223,跟前面相比,使用上會相對簡單,Java 可以嵌入 Jython engine 來執行 Python 的程式。相關資訊可以參考 http://scripting.dev.java.net (此網址已經失效),Jython 版本得用 2.5.1 以後的才行,然後要記得把 jython.jar 放到 CLASSPATH 裡。
作者提到使用 JSR-223 的另外一個好處是可以直接存取到 PyObject,我想這個好處應該是指可以利用 PyObject 的一些功能吧。

看到這邊,我是覺得有點奇怪,為什麼會特別提到 JSR-223?? 從上一節的範例裡看不出來有什麼特別的不一樣。參考這篇:为Java创建你自己的脚本语言-JSR 223介绍以後,才知道原來 JSR-223 提供了 ScriptEngineManager 類別,同時也提供了腳本引擎自動發現的機制,只要把必要的腳本引擎放到 CLASSPATH 裡,ScriptEngineManager 就會自動找到,透過 ScriptEngineManager 也可以去取得腳本引擎並執行腳本,不需要特別去 import 了。這樣跟前面一比較起來,就相差很多。

我認為前兩節的範例可能給錯了。

相關參考資料:

更多有關 The Definitive Guide to Jython: Python for the Java Platform 的事情
arrow
arrow

    elleryq 發表在 痞客邦 留言(0) 人氣()