将Java类包装到Python中的最佳方法

时间:2018-05-09 11:38:42

标签: java python wrapper py4j

我有一个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

这有效,但我只在必要时才这样做。如果课程直接起作用,我就不会写任何东西来包装它。

0 个答案:

没有答案