Pyjnius: Mewarisi dari kelas Java tidak berfungsi

Dibuat pada 22 Agu 2012  ·  7Komentar  ·  Sumber: kivy/pyjnius

Sebagian dari masalahnya adalah JavaMetaClass. new mengasumsikan bahwa itu akan selalu dipanggil untuk membuat proxy, ketika itu akan dipanggil untuk setiap kelas turunan. Pada baris yang sama, penanganan jclass_registry harus dibatasi untuk proxy yang sebenarnya. Hal lain yang saya temukan adalah bahwa perlakuan objek yang dikembalikan dari Java lemah, yang membuatnya tidak mungkin untuk meneruskannya kembali ke metode Java.

Saya dapat mengerjakan beberapa masalah ini pada waktunya.

Saya sangat menyukai seberapa cepat jnius memuat Java, dan dapat menggunakan versi terbaru Python.

Ingin mendukung masalah ini? Posting hadiah di atasnya! Kami menerima bounty melalui Bountysource .

enhancement

Semua 7 komentar

Maaf atas keterlambatannya, dapatkah Anda memberikan deskripsi (testcases?) yang lebih spesifik untuk setiap masalah tersebut? Saya memulai beberapa pekerjaan untuk mengizinkan pewarisan kelas Java dari python (menggunakan proxy), tetapi itu tidak lengkap, namun, masalah yang Anda tunjukkan di sini tampaknya terkait secara longgar dengan itu, dan mungkin harus dibagi dalam beberapa masalah berbeda.

Maaf untuk masuk ke diskusi, tetapi mewarisi Java sebuah kelas mungkin bukan yang Anda butuhkan @Apalala , saya pikir itu ide yang lebih baik untuk membungkus kelas Java di kelas Python seperti yang dilakukan di kelas ini . Mungkin tidak jelas dalam kode yang ditautkan karena semua autoclass dilakukan di Java.py tetapi kodenya setara dengan

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

Alasan untuk tidak mewarisi kelas Java adalah:

  • Metode Java menggunakan konvensi penamaan Java dan terlihat jelek dalam kode Python, kemungkinan besar Anda ingin mengganti nama metode sehingga memiliki tampilan Python dan tidak mengejutkan pengembang lain yang terbiasa dengan pep8 (kecuali jika Anda menggunakan Zope lama dan bengkok kode...)
  • Secara umum, ini menghindari kekacauan objek python dict dengan metode yang diwarisi Java, beberapa metode Java tidak ada hubungannya dengan binding Python, mereka hampir tidak akan dipanggil mungkin tidak pernah. Membungkus kelas Java membuat kelas Python lebih bersih di REPL dan mungkin menghindari panggilan mengerikan ke metode Java yang tidak didukung. Perhatikan fakta bahwa Jika Anda tidak menggunakan garis bawah ganda, metode Java masih tersedia dengan mudah.
  • Last but not least, ada kemungkinan besar Anda harus menambahkan kode boilerplate sebelum atau setelah panggilan ke beberapa metode Java, kemungkinan besar Anda akan mengganti beberapa metode Java dengan Python sehingga Anda melakukan konversi tipe/kelas yang tepat atau hal-hal lain , jadi Anda akhirnya membuat metode Python untuk metode Java seperti yang akan Anda lakukan ketika Anda membungkus kelas Java alih-alih mewarisinya saat masih bisa A) mengganti nama metode B) menjaga dict tetap bersih. Lihatlah metode class Element , class Node dan class Relationship dalam grafik , hampir semuanya memiliki kode boilerplate meskipun sebagian besar waktu untuk membuat API lebih Pythonic ;)

Dari segi performa, saya rasa tidak ada pengaruhnya, tapi @tshirtman mungkin lebih tahu.

Hal lain, membungkus objek Java berfungsi sekarang dan sangat baik :-)

Apakah mengganti metode Java menggunakan kode python mungkin untuk saat ini?
Bagaimana dengan pewarisan kelas java?

Saya telah menghabiskan cukup banyak waktu untuk melihat ini, dan saya sampai pada kesimpulan bahwa tidak ada cara praktis untuk melakukannya, selain menghasilkan bytecode Java saat runtime, ada perpustakaan untuk melakukan itu, tetapi rasanya seperti menambahkan banyak komplikasi ke perpustakaan, dan mungkin di luar jangkauan. Tidak yakin tentang penutupan, tetapi saya tidak berpikir itu akan berhasil, jadi tidak masuk akal untuk menandainya sebagai tidak akan diperbaiki.

@monami7001 ada kemajuan?

itu ~ 4 tahun yang lalu, dan setahu saya tidak, menghasilkan Java bytecode saat runtime masih terlihat seperti satu-satunya pilihan (dan mungkin itu tidak seburuk yang saya pikirkan dan kita harus melihat ke dalamnya).

Salah satu solusi adalah:

  1. buat proyek Java terpisah termasuk android.jar dari API versi android yang ditargetkan
  2. mengimplementasikan kode (warisan/penggantian...)
  3. ekspor ke toples
  4. impor di buildozer

untuk menggunakannya dengan autoclass

Apakah halaman ini membantu?
0 / 5 - 0 peringkat