2011-01-06 12 views
1

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インターフェイスに応じてデフォルトとする)。

何が間違っていますか?

+0

私はJythonを使用しませんでしたが、 'getEngineByName(" jruby ")'が目立ちます。確かにそれは "ジャイソン"である必要がありますか? –

+0

それに気づいてくれてありがとう - 私は修正しました。コードは基本的に同じなので、前の質問からコピーしました。ごめんなさい。 – Guss

+0

なぜ 'engine'と' m_engine'がありますか? – jfs

答えて

2

あなたはどのバージョンのjythonを使用していますか?バグの説明からhttp://bugs.jython.org/issue1681

:あなたはJSR223のJythonバグに遭遇している場合があります はJSR223とJythonの2.5.2rc2を使用するときに埋め込まれたJythonスクリプトからメソッドを呼び出す

はJythonの2.2ながら、何もしません.1ちょうどうまく動作します。

+0

確かに、それは明らかに問題です - 私はJython 2.5.2rc2を使用していましたが、Jython 2.5.2rc3へのアップグレードは私の問題を解決しました。ありがとう! – Guss

関連する問題