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__
から印刷が表示されない、走っているが、test
変数run()
表情のように有効なjythonの「プロキシオブジェクト」とキャストエラーは発生しません。 fibonacci()
メソッドを実行しようとすると、常に固定の数値を返すようにメソッドを変更しても常に0が返され、filterLength()
メソッドは常にnullを返します(おそらくJavaインターフェイスに応じてデフォルトとする)。
何が間違っていますか?
私はJythonを使用しませんでしたが、 'getEngineByName(" jruby ")'が目立ちます。確かにそれは "ジャイソン"である必要がありますか? –
それに気づいてくれてありがとう - 私は修正しました。コードは基本的に同じなので、前の質問からコピーしました。ごめんなさい。 – Guss
なぜ 'engine'と' m_engine'がありますか? – jfs