Я пытаюсь сделать что-то похожее на 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).
что я делаю неправильно?
Я не использовал Jython, но 'getEngineByName (« jruby »)' выделяется. Неужели это должно быть «jython»? –
спасибо, что заметил - исправил. Код в основном тот же, поэтому я просто скопировал из предыдущего вопроса. Прости. – Guss
Почему есть 'engine' и' m_engine'? – jfs