Pyjnius: La herencia de las clases de Java no funciona

Creado en 22 ago. 2012  ·  7Comentarios  ·  Fuente: kivy/pyjnius

Parte del problema es que JavaMetaClass. new asume que siempre se llamará para crear un proxy, cuando se llamará para cada clase descendiente. En la misma línea, el manejo de jclass_registry debe estar restringido a proxies reales. Otra cosa que encontré es que el tratamiento de los objetos devueltos por Java es laxo, lo que hace que sea imposible devolverlos a los métodos de Java.

Puedo trabajar en algunos de estos temas a su debido tiempo.

Me gusta mucho lo rápido que jnius carga Java y puede usar las últimas versiones de Python.

¿Quieres respaldar este problema? ¡Pon una recompensa por ello! Aceptamos recompensas a través de Bountysource .

enhancement

Todos 7 comentarios

Disculpe la demora, ¿puede proporcionar una descripción más específica (¿casos de prueba?) para cada uno de esos problemas? Comencé un trabajo para permitir la herencia de clases Java de Python (usando proxies), pero no está completo, sin embargo, los problemas que señala aquí parecen estar relacionados con eso, y probablemente deberían dividirse en varios problemas diferentes.

Lamento entrar en la discusión, pero heredar una clase de Java podría no ser lo que necesita @Apalala , creo que es una mejor idea envolver la clase de Java en una clase de Python como se hace en esta clase . Puede que no sea obvio en el código vinculado porque todas las clases automáticas se realizan en java.py pero el código es equivalente a

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

Las razones para no heredar la clase Java son:

  • Los métodos de Java usan convenciones de nomenclatura de Java y se ven feos en el código de Python, lo más probable es que desee cambiar el nombre de los métodos para que tengan un aspecto de Python y no sorprendan a otros desarrolladores acostumbrados al pep8 (excepto si hace un Zope viejo y retorcido). código...)
  • En general, se evita que saturan el dict objeto de Python con los métodos heredados de Java, algunos métodos de Java no tienen nada que ver en enlaces Python, que apenas se llama tal vez no. Envolver la clase de Java hace que la clase de Python sea más limpia en REPL y posiblemente evita llamadas terribles a métodos de Java no compatibles. Tenga en cuenta el hecho de que si no usa el doble guión bajo, los métodos de Java aún están fácilmente disponibles.
  • Por último, pero no menos importante, hay muchas posibilidades de que tenga que agregar código repetitivo antes o después de la llamada a algunos métodos de Java, lo más probable es que anule algunos métodos de Java en Python para que pueda realizar la conversión de tipo/clase adecuada u otras cosas. , por lo que termina creando un método de Python para el método de Java tal como lo haría cuando envolviera la clase de Java en lugar de heredarla mientras aún puede A) cambiar el nombre del método B) mantener el dict limpio. Mire los métodos de class Element , class Node y class Relationship en el gráfico, casi todos tienen código repetitivo, incluso si la mayoría de las veces es para hacer que la API sea más Pythonic;)

Desde un punto de vista perceptivo, no creo que haya ningún impacto, pero @tshirtman podría saberlo mejor.

Otra cosa, envolver objetos Java funciona ahora mismo y muy bien :-)

¿Es posible anular el método java usando el código python por ahora?
¿Qué pasa con la herencia de clase Java?

Pasé bastante tiempo buscando en esto, y llegué a la conclusión de que no había una forma práctica de hacerlo, aparte de generar el código de bytes de Java en tiempo de ejecución, hay bibliotecas para hacer eso, pero eso se sintió como agregar mucha complicación para la biblioteca, y probablemente fuera del alcance. No estoy seguro acerca del cierre, pero no creo que vaya a funcionar, por lo que no sería descabellado marcarlo como wontfix.

@ monami7001 ¿ algún progreso?

eso fue hace ~ 4 años, y que yo sepa, no, generar el código de bytes de Java en el tiempo de ejecución todavía parece ser la única opción (y tal vez no sea tan malo como pensé y deberíamos investigar eso).

Una solución es:

  1. cree un proyecto Java separado que incluya el android.jar de la API de la versión de Android objetivo
  2. implementar el código (herencia/anulaciones...)
  3. exportar a tarro
  4. importar en buildozer

para usarlo con autoclass

¿Fue útil esta página
0 / 5 - 0 calificaciones