我試圖做同樣的事情,以Question 4617364但對於Python的正確初始化 - 從python腳本文件,其中所述類實現了Java接口,並把它交給一些加載類可以使用其方法的Java代碼 - 但調用對象方法返回無效值並從初始化程序打印似乎沒有任何作用。Jython腳本執行一類是不從Java
我的實現看起來是這樣的:
接口:
package some.package;
import java.util.List;
public interface ScriptDemoIf {
int fibonacci(int d);
List<String> filterLength(List<String> source, int maxlen);
}
Python實現:
from some.package import ScriptDemoIf
class ScriptDemo(ScriptDemoIf):
""" Class ScriptDemo implementing ScriptDemoIf """
def __init__(self):
print "Script Demo init"
def fibonacci(self, d):
if d < 2:
return d
else:
return self.fibonacci(d-1) + self.fibonacci(d-2)
def filterLength(self, source, maxlen):
return [ str for str in source if len(str) <= maxlen ]
類裝載器:
public ScriptDemoIf load(String filename) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("jython");
FileReader script = new FileReader(filename);
try {
engine.eval(new FileReader(script));
} catch (FileNotFoundException e) {
throw new ScriptException("Failed to load " + filename);
}
return (ScriptDemoIf) engine.eval("ScriptDemo()");
}
public void run() {
ScriptDemoIf test = load("ScriptDemo.py");
System.out.println(test.fibonacci(30));
}
(顯然裝載機有點在現實生活中更通用 - 它並不假設實現類名是「ScriptDemo」 - 這只是爲了簡單)。
當代碼正在跑,我看不出從Python的__init__
(不過,如果我把打印腳本的身體,然後我就看到)打印,但在run()
模樣test
變量一個有效的jython「代理對象」,我沒有得到鑄造錯誤。當我嘗試運行fibonacci()
方法我總是得到0(即使我改變方法總是返回一個固定的數)和filterLength()
方法始終返回null(可能是一些根據Java界面默認爲這樣做)。
我做錯了什麼?
您使用什麼版本的Jython的
我沒有用的Jython,但'getEngineByName所( 「JRuby的」)'脫穎而出。當然,這需要是「jython」? – 2011-01-06 19:37:49
感謝您注意到 - 我修好了。代碼基本上是一樣的,所以我剛剛從我以前的問題中複製過來。抱歉。 – Guss 2011-01-06 19:41:37
爲什麼有'engine'和'm_engine'? – jfs 2011-01-19 18:10:37