从Java调用Jython(Jython脚本调用Java,然后Java再回调Jython)
我的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解释器能确保对它的访问是同步的……