Jython-скрипт, реализующий класс, не правильно инициализирован из Java - PullRequest
1 голос
/ 06 января 2011

Я пытаюсь сделать что-то похожее на Вопрос 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() всегда возвращает ноль (вероятно, что-то, что связано со значениями по умолчанию в соответствии с интерфейсом Java).

что я делаю не так?

1 Ответ

2 голосов
/ 19 января 2011

Какую версию Jython вы используете? Возможно, вы столкнулись с ошибкой JSR223 Jython: http://bugs.jython.org/issue1681

Из описания ошибки:

Вызов методов из встроенного скрипта Jython ничего не делает, когда используя JSR-223 и Jython 2.5.2rc2, в то время как Jython 2.2.1 просто отлично работает.

...