这里只列写关键代码,源码与文档中有对应。
py4j:
入门:
what:允许python编译器动态的访问JVM中的java对象,或者反过来
简单用例,Python使用GatewayServer访问JVM:
Python端:
gateway =JavaGateway()
java_app=gateway.entry_point
java_app.addition(number1, number2)) //根据入口点调用stack = gateway.entry_point.getStack() //根据get方法获取对象java_list = gateway.jvm.java.util.ArrayList() //获取java的list
Java端:
//它允许 Python 程序通过本地网络套接字与 JVM 通信。
GatewayServer server = newGatewayServer(app); 实例化entry_point
server.start();
Python里对JVM集合的切片:操作不会影响原集合,因为切片是在JVM中也做了一次拷贝,链接出的的python对象。
进阶:
1 2.支持数组与collection的直接创建:
gateway = JavaGateway()
int_class = gatew
int_array = gateway.new_array(int_class,2)ay.jvm.int
arrayList = gateway.jvm.java.util.ArrayList()
set = gateway.jvm.java.util.HashSet()
map = gateway.jvm.java.util.HashMap()
3 通过callback实现Java接口
//接口实现类在初始化时将gateway赋值def __init__(self, gateway):
self.gateway=gateway
class Java:
implements = ["Java接口全限定名"]if __name__ == "__main__"://使用Callback参数
gateway=JavaGateway(
callback_server_parameters=CallbackServerParameters())
listener= PythonListener(gateway)
4 线程模型
多线程模型:JavaGateway和CallbackServer,Py4j会每次创建一个线程
单线程模型:
gateway =ClientServer(
java_parameters=JavaParameters(),
python_parameters=PythonParameters())
Clientserver科欧
5 从java端创建一个会话
需要:
1.启动python进程,新建一个JavaGateway或ClientServer
2.创建一Python实例实现Java接口,作为python_server_entry_point参数
3.在java侧启动JavaGateway或ClientServer
4.调用getPythonServerEntryPoint获取python的entry point,得到java接口实现
使用JavaGateway:
gateway =JavaGateway(
callback_server_parameters=CallbackServerParameters(),
python_server_entry_point=simple_hello)
使用ClientServer:
//java
ClientServer clientServer=new ClientServer(null);// We get an entry point fromthe Python side
IHello hello= (IHello) clientServer.getPythonServerEntryPoint(new Class[] { IHello.class});//Python
gateway=ClientServer(
java_parameters=JavaParameters(),
python_parameters=PythonParameters(),
python_server_entry_point=simple_hello)
6.使用动态端口:launch_gateway
7.python集合转换为java集合
gateway = JavaGateway(gateway_parameters=GatewayParameters(auto_convert=True))
python集合可以使用方法,但是作为拷贝不会被java方法修改
8监听events:
//Java
GatewayServer.addListener//Python
server_started.connect(started)
gateway=JavaGateway(
gateway_parameters=GatewayParameters(),
callback_server_parameters=CallbackServerParameters())
9 内存模型
Java对象在Python侧:Java对象发送给python侧,一个对象引用会维护在java侧(Gateway中)。一旦对象在PVM被回收,则引用也会在JVM中回收。如果gateway被关闭,剩余的对象也会被回收。
Python对象在Java端,对此对象的引用会保留在python端。直到被JVM回收。
API:
py4j.clientserver
clientServer是JavaGateway的子类,完全兼容给JavaGateway的代码
JavaParameters