牛骨文教育服务平台(让学习变的简单)
博文笔记

Java调用Python

创建时间:2015-06-11 投稿人: 浏览次数:1906

项目中有特殊要求,为了灵活,某个接口需要在Python脚本中实现,然后在Java代码中调用Python脚本来实例化对象。

网上一般的文章都是用PythonInterpreter来调用,不过大神说创建PythonInterpreter会消耗很多资源,影响效率,可以使用PySystemState,

先用PySystemState得到一个importer再导入Python的module,得到module里的类的实例,至于原理,我不是很懂。

首先是Python脚本,这里简单意思一下就好,毕竟可能涉及公司规定,不宜将全部代码都贴出来。

#省略import
class ClassName(InterfaceName):
    def __init__(self):
        #省略若干代码
    def function(self):
        #省略若干代码
    #省略若干代码
其中,ClassName是该类的类名,InterfaceName是实现的Java接口的名字,接下来是Java代码
public static void main(String[] args) {
        PySystemState state = new PySystemState();
	PyObject clazz;
	Py.getSystemState().path.append(Py.newString("E:\dir"));
	PyObject importer = state.getBuiltins().__getitem__(Py.newString("__import__"));
	PyObject module = importer.__call__(Py.newString("Script"));
	clazz = module.__findattr__("ClassName");
	InterfaceName obj = (InterfaceName) clazz.__call__().__tojava__(InterfaceName.class);
}
这里将脚本文件放在了E盘的dir文件夹下,Script是脚本文件的名字(注意不能为test,否则报空指针),这样就得到了实现InterfaceName接口的类的对象,与直接使用Java实现该接口没有什么区别,作用就是在程序运行的时候也可以在不修改Java代码的情况下添加新的类,比较灵活。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。