使用 Pyjnius 覆盖 Python 中的 Java 方法

Posted

技术标签:

【中文标题】使用 Pyjnius 覆盖 Python 中的 Java 方法【英文标题】:Override Java methods in Python using Pyjnius 【发布时间】:2020-07-01 16:14:04 【问题描述】:

我想使用 Pyjnius 创建一个 Python 类,它扩展了一个 Java 类并覆盖了它的一些方法。

具体来说,这些 Java 类:

public class A 

    public void test_method() 
        System.out.println("In parent test_method!!!");
    

    public static void run(A a) 
        System.out.println("Running...");
        a.test_method();
    


public class B extends A 

    public void test_method() 
        System.out.println("test method");
    

    public static void main(String[] args) 
        A.run(new B());
    

当我运行时,我看到:

Running...
test method

如何使用 Pyjnius 在 Python 中重新实现 B

这是我的尝试:

import jnius_config
jnius_config.set_classpath('jars/testClasses.jar')

from jnius import autoclass, PythonJavaClass, JavaClass, MetaJavaClass, java_method

A = autoclass('test.pyjnius.A')


class B(A):
    __javaclass__ = 'test/pyjnius/A'

    @java_method('()Z')
    def test_method(self):
        print("test method")


A.run(B())

当我运行 Python 版本时,我看到:

Running...
In parent test_method!!!

它没有正确覆盖test_method。我该如何解决?

【问题讨论】:

【参考方案1】:

这里的答案是我想要做的事情是不可能的。 JVM 无法调用在 Python 子类中实现的 a 方法,因为它甚至不知道它存在。

解决方法是在类B 中实现run 方法,但要适应子类的方法。像这样的:

class B(A):
    __javaclass__ = 'test/pyjnius/A'

    @java_method('()Z')
    def test_method(self):
        print("test method")

    def run(self):
        A.runPart1(self)
        self.test_method()
        A.runPart2(self)

runPart1runPart2 在 Java 中实现在类 A 的修改版本中。

【讨论】:

以上是关于使用 Pyjnius 覆盖 Python 中的 Java 方法的主要内容,如果未能解决你的问题,请参考以下文章

Kivy + PyJnius 检查安卓版本

python加载和使用java的类的方法

Python Kivy/Pyjnius android NotificationListenerService

使用 PyJnius 从 Python 实现 Java 接口

Python 与 Java,PyJNIus 安装

导入我自己的 java 文件时找不到 Pyjnius 类