私は質問4617364に似た何かをしようとしていますが、Pythonの場合-Pythonスクリプトファイルからクラスをロードします。このクラスはJavaインターフェイスを実装し、そのメソッドを使用できる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インターフェイスによるデフォルトと関係があります)。
私は何が間違っているのですか?