从Java调用Jython(Jython脚本调用Java,然后Java再回调Jython)

0 投票
1 回答
963 浏览
提问于 2025-04-18 03:21

我的Jython脚本正在调用我用Java写的一些代码(因为我对Java的多线程比较熟悉)。现在我发现我需要从Java中调用一个Jython的方法(否则我就得把它重新写成Java代码)。

从Jython调用Java代码很简单,而且设置Java为主控,Jython为从控也很直接,但要让它们互相调用的最佳方式就没那么明显了。

官方文档里有一篇很长的文章讲这个问题:第10章:Jython与Java的集成,乍一看这项任务似乎很复杂:一对一的对象工厂、松耦合的工厂,还有很多代码需要写才能让它工作。

我还找到了一些其他的资料,也讲得很详细,但都没有提供简单的解决方案:

因为已经有一个Jython解释器在运行,所以应该有简单的方法可以在里面调用一个方法,而不需要像上面最后一个链接那样实例化一个新的解释器(如果Java在控制Jython,你就需要这样做)。实际上有这样的方式吗?

1 个回答

0

这篇文章提供了一个简单的解决方案,下面的例子可以正常工作。Java代码如下:

import org.python.core.PyObject;

public class JythonFromJava {
    public void callPO(PyObject po) {
        po.__call__();
    }
}

编译命令是:

$ javac -classpath ".;C:\Programs\jython2_7b1\jython.jar" JythonFromJava.java

Jython代码如下:

import JythonFromJava

def method():
    print "METHOD called"

j = JythonFromJava()
j.callPO(method)

运行它的命令是:

$ jython jython_from_java_j.py 
METHOD called

看起来这就是所需的全部内容。我们需要把一个句柄传给Jython的方法,这就像是一个回调函数,不过在这个情况下,它不是用来处理异步请求的,而是用来处理不同编程语言之间的请求。


编辑:我不太确定这对多线程有什么影响。我会在Java代码中创建并启动一个新线程来调用Jython的方法,所以我希望Jython解释器能确保对它的访问是同步的……

撰写回答