2011-01-06 2 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» - это просто для простоты).

Когда код быть побежал, я не вижу печать из Питона __init__ (хотя, если я поставил печать в теле сценария, то я вижу, что), но test переменные в run() выглядеть действительный «прокси-объект» jython, и я не получаю ошибок при кастинге. Когда я пытаюсь запустить метод fibonacci(), я всегда получаю 0 (даже если я изменяю метод, чтобы всегда возвращать фиксированное число), а метод filterLength() всегда возвращает значение null (вероятно, что-то делать с настройками по умолчанию в соответствии с интерфейсом Java).

что я делаю неправильно?

+0

Я не использовал Jython, но 'getEngineByName (« jruby »)' выделяется. Неужели это должно быть «jython»? –

+0

спасибо, что заметил - исправил. Код в основном тот же, поэтому я просто скопировал из предыдущего вопроса. Прости. – Guss

+0

Почему есть 'engine' и' m_engine'? – jfs

ответ

2

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

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

Calling методы из встроенного сценария Jython ничего не делает, когда используя JSR223 и Jython 2.5.2rc2, в то время как Jython 2.2 .1 просто отлично работает.

+0

Действительно, это, по-видимому, проблема - я использовал Jython 2.5.2rc2 и обновление до Jython 2.5.2rc3 решил проблему для меня. Благодаря! – Guss

Смежные вопросы