Pyjnius: 从 Java 类继承不起作用

创建于 2012-08-22  ·  7评论  ·  资料来源: kivy/pyjnius

部分问题在于 JavaMetaClass。 new假设它总是被调用来创建一个代理,当它被每个后代类调用时。 在同一行,jclass_registry 的处理必须限于实际代理。 我发现的另一件事是,对从 Java 返回的对象的处理是松懈的,这使得无法将它们传递回 Java 方法。

我可以在适当的时候解决其中的一些问题。

我非常喜欢 jnius 加载 Java 的速度,并且能够使用最新版本的 Python。

想要支持这个问题? 在上面发布赏金! 我们通过Bountysource接受赏金。

enhancement

所有7条评论

抱歉耽搁了,您能否为每个问题提供更具体的(测试用例?)描述? 我开始了一些工作以允许从 python 继承 java 类(使用代理),但这并不完整,但是,您在此处指出的问题似乎与此松散相关,并且可能应该分成几个不同的问题。

很抱歉参加讨论,但是继承 Java 类可能不是您需要的@Apalala ,我认为将 Java 类包装在 Python 类中是一个更好的主意,就像在此类中所做的那样。 在链接代码中可能并不明显,因为所有自动类都在java.py中完成,但代码等效于

class MyJavaWrapperClass(AnyPythonClassOrMixin):

    def __init__(self, *args, **kwargs):
        JavaClass = autoclass('org.uber.cool.JavaClass`)
        self._my_java_object = JavaClass(*args, **kwargs)  # use double underscore to "hide" the Java object

不继承Java类的原因是:

  • Java 方法使用 Java 命名约定并且在 Python 代码中看起来很难看,您很可能希望重命名这些方法,以便它们具有 Python 外观,并且不会让其他习惯于 pep8 的开发人员感到惊讶(除非您使用旧的 twisted 和旧的 Zope代码...)
  • 一般来说,它避免了python对象字典与Java继承方法的混乱,一些Java方法在Python绑定中没有任何关系,它们几乎不会被调用,也许永远不会。 包装 Java 类使 REPL 中的 Python 类更干净,并可能避免对不受支持的 Java 方法的可怕调用。 请注意,如果您不使用双下划线,Java 方法仍然很容易使用。
  • 最后但并非最不重要的一点是,您很有可能必须在调用某些 Java 方法之前或之后添加样板代码,您很可能会在 Python 中覆盖某些 Java 方法,以便进行正确的类型/类转换或其他事情, 所以你最终为 Java 方法创建了一个 Python 方法,就像你在包装 Java 类而不是继承它时所做的那样,同时仍然能够 A) 重命名方法 B) 保持dict干净。 看看class Elementclass Nodeclass Relationship的方法,几乎​​所有这些方法都有样板代码,即使大部分时间是为了使 API 更 Pythonic ;)

从性能角度来看,我认为没有任何影响,但@tshirtman可能更清楚。

另一件事,包装Java对象现在工作得很好:-)

现在可以使用 python 代码覆盖 java 方法吗?
java类继承呢?

我花了很多时间研究这个,我得出的结论是没有实际的方法可以做到这一点,除了在运行时生成 java 字节码之外,还有库可以做到这一点,但感觉就像添加图书馆有很多复杂性,并且可能超出范围。 不确定是否要关闭,但我认为它不会继续工作,因此将其标记为 wontfix 并不是不合理的。

@monami7001有什么进展吗?

那是大约 4 年前的事了,据我所知,在运行时生成 java 字节码仍然是唯一的选择(也许它不像我那么糟糕,我们应该研究一下)。

一种解决方法是:

  1. 创建单独的 Java 项目,包括目标 android 版本 API 的 android.jar
  2. 实现代码(继承/覆盖...)
  3. 导出到 jar
  4. 在 buildozer 中导入

将它与自动类一起使用

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Thrameos picture Thrameos  ·  27评论

cthoyt picture cthoyt  ·  11评论

Hukuta picture Hukuta  ·  5评论

hanslovsky picture hanslovsky  ·  3评论

ghost picture ghost  ·  3评论