Переопределить Java методы в Python, используя Pyjnius - PullRequest
0 голосов
/ 20 марта 2020

Я хотел бы использовать 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

Как мне повторно реализовать B в Python, используя Pyjnius?

Это моя попытка:

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 Ответ

0 голосов
/ 02 апреля 2020

Ответ здесь такой: то, что я пытаюсь сделать, невозможно. JVM не может вызвать метод, реализованный в подклассе Python, потому что он даже не знает о его существовании.

Обходной путь должен реализовать метод run в классе B, но сделать приспособления для метод подкласса. Примерно так:

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.

...