1

私は質問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インターフェイスによるデフォルトと関係があります)。

私は何が間違っているのですか?

4

1 に答える 1

2

どのバージョンのjythonを使用していますか?JSR223 Jythonのバグに遭遇した可能性があります:http://bugs.jython.org/issue1681

バグの説明から:

JSR-223とJython2.5.2rc2を使用している場合、埋め込まれたJythonスクリプトからメソッドを呼び出しても何も起こりませんが、Jython2.2.1は問題なく機能します。

于 2011-01-19T17:35:58.597 に答える