使用 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)
runPart1
和 runPart2
在 Java 中实现在类 A
的修改版本中。
【讨论】:
以上是关于使用 Pyjnius 覆盖 Python 中的 Java 方法的主要内容,如果未能解决你的问题,请参考以下文章
Python Kivy/Pyjnius android NotificationListenerService