Я пытаюсь сделать что-то похожее на Вопрос 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).
что я делаю не так?