1

我正在尝试做与问题 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()方法总是返回 null(根据 Java 接口可能与默认值有关)。

我究竟做错了什么?

4

1 回答 1

2

您使用的是什么版本的 jython?您可能遇到了 JSR223 Jython 错误:http ://bugs.jython.org/issue1681

从错误描述:

在使用 JSR-223 和 Jython 2.5.2rc2 时,从嵌入式 Jython 脚本调用方法没有任何作用,而 Jython 2.2.1 则可以正常工作。

于 2011-01-19T17:35:58.597 回答