Pyjnius: Наследование от классов Java не работает

Созданный на 22 авг. 2012  ·  7Комментарии  ·  Источник: kivy/pyjnius

Часть проблемы заключается в том, что JavaMetaClass. new предполагает, что он всегда будет вызываться для создания прокси, когда он будет вызываться для каждого класса-потомка. В той же строке обработка jclass_registry должна быть ограничена реальными прокси. Еще я обнаружил, что обработка объектов, возвращаемых из Java, является слабой, что делает невозможным их передачу обратно в методы Java.

Я могу поработать над некоторыми из этих вопросов в свое время.

Мне очень нравится, насколько быстро jnius загружает Java и может использовать последние версии Python.

Хотите поддержать этот вопрос? Разместите награду за это! Мы принимаем награды через Bountysource .

enhancement

Все 7 Комментарий

Извините за задержку, можете ли вы предоставить более конкретное описание (тестовые случаи?) для каждой из этих проблем? Я начал некоторую работу, чтобы разрешить наследование классов java от python (с использованием прокси), но она не завершена, однако проблемы, которые вы здесь указываете, кажутся слабо связанными с этим и, вероятно, должны быть разделены на несколько разных проблем.

Извините, что вступаю в дискуссию, но наследование класса 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 (за исключением тех случаев, когда вы используете старые извращенные и старые Zope код...)
  • Как правило, это позволяет избежать загромождения объекта python унаследованными методами Java, некоторые методы Java не имеют ничего общего с привязками Python, они вряд ли будут вызываться, возможно, никогда. Обертывание класса Java делает класс Python чище в REPL и, возможно, позволяет избежать ужасных вызовов неподдерживаемых методов Java. Имейте в виду тот факт, что если вы не используете двойное подчеркивание, методы Java по-прежнему легко доступны.
  • И последнее, но не менее важное: существует высокая вероятность того, что вам придется добавлять шаблонный код до или после вызова некоторых методов Java, вы, скорее всего, переопределите некоторые методы Java в Python, чтобы выполнить правильное преобразование типа/класса или другие вещи. , так что в конечном итоге вы создаете метод Python для метода Java точно так же, как если бы вы обертывали класс Java вместо того, чтобы наследовать его, при этом все еще имея возможность: а) переименовать метод, б) сохранить чистоту словаря . Посмотрите на методы class Element , class Node и class Relationship на графике, почти все они имеют шаблонный код, даже если большую часть времени это делается для того, чтобы сделать API более Pythonic;)

Судя по производительности, я не думаю, что есть какое-то влияние, но @tshirtman может знать лучше.

Другое дело, обертывание объектов Java работает прямо сейчас и очень хорошо :-)

Возможно ли переопределение метода java с использованием кода python на данный момент?
Как насчет наследования классов Java?

Я потратил довольно много времени на это, и я пришел к выводу, что не было никакого практического способа сделать это, за исключением генерации байт-кода Java во время выполнения, для этого есть библиотеки, но это было похоже на добавление много усложняет библиотеку и, вероятно, выходит за рамки. Не уверен насчет закрытия, но я не думаю, что над этим будут работать, поэтому было бы разумно пометить его как неисправленное.

@ monami7001 есть прогресс?

это было ~ 4 года назад, и, насколько мне известно, нет, генерация байт-кода Java во время выполнения по-прежнему выглядит единственным вариантом (и, возможно, это не так плохо, как я, и мы должны изучить это).

Один обходной путь :

  1. создать отдельный проект Java, включая android.jar целевой API версии Android
  2. реализовать код (наследование/переопределение...)
  3. экспортировать в банку
  4. импортировать в билдозер

использовать его с автоклассом

Была ли эта страница полезной?
0 / 5 - 0 рейтинги