我有一个Java库,我必须为它构建一个Python包装器。
我正在使用py4j,并且使用方法完成任何实例和任何类都非常容易。
问题是对象的类型与其类不对应。
来自python:
>>> gw = JavaGateway()
>>> a_circle = gw.jvm.com.geometry.Circle(15)
>>> a_circle.getDiameter()
30
>>> type(a_circle)
<class 'py4j.java_gateway.JavaObject'>
基本用法几乎没问题,但如果我想创建自定义构造函数怎么办?我应该继承JavaObject
类吗?或者最好从头开始创建我的类,并且每个方法和构造函数都调用相应的Java方法?
有什么建议可以实现它吗?我应该尝试不同于py4j的东西吗? 谢谢!
编辑:例如,我必须包装一个有3个方法的Java类,其中一个方法将数组作为参数,所以我必须注入一些代码才能进行转换。
class Service:
def __init__(self, javaService):
'''
Create a new instance of Service, assigning Java methods as attributes.
Accepts a working instance of Service from Java
This constructor is not meant to be called by the user.
'''
self.subscribe = javaService.subscribe
self.unsubscribe = javaService.unsubscribe
def publish(values):
'''
Wraps the java implementation of this method, converting the list of value from a Python iterable to a Java list.
'''
global java_gateway
parameterValues = ListConverter().convert(values, java_gateway._gateway_client)
return javaService.publish(values)
self.publish = publish
这有效,但我只在必要时才这样做。如果课程直接起作用,我就不会写任何东西来包装它。