Pyjnius: Javaクラスからの継承は機能しません

作成日 2012年08月22日  ·  7コメント  ·  ソース: kivy/pyjnius

問題の一部は、そのJavaMetaClassです。 newは、すべての子孫クラスに対して呼び出されるときに、プロキシを作成するために常に呼び出されることを前提としています。 同じ行で、jclass_registryの処理は実際のプロキシに制限する必要があります。 私が見つけた他の何かは、Javaから返されたオブジェクトの処理が緩いため、Javaメソッドにオブジェクトを戻すことができないということです。

私はこの問題のいくつかにやがて取り組むことができます。

jniusがJavaをロードする速度と、最新バージョンのPythonを使用できることが非常に気に入っています。

この問題を支持したいですか? それに賞金を投稿してください! Bountysourceを介して報奨金を受け取ります。

enhancement

全てのコメント7件

遅れて申し訳ありませんが、これらの問題のそれぞれについて、より具体的な(テストケース?)説明を提供できますか? Pythonから(プロキシを使用して)Javaクラスを継承できるようにするための作業を開始しましたが、完全ではありません。ただし、ここで指摘する問題は、それと大まかに関連しているようであり、おそらくいくつかの異なる問題に分割する必要があります。

議論に参加して申し訳ありませんが、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オブジェクトのdictがJavaの継承メソッドで乱雑になるのを防ぎます。一部のJavaメソッドは、Pythonバインディングとは何の関係もありません。ほとんど呼び出されない可能性があります。 Javaクラスをラップすると、REPLでPythonクラスがよりクリーンになり、サポートされていないJavaメソッドへの恐ろしい呼び出しを回避できる可能性があります。 二重アンダースコアを使用しない場合でも、Javaメソッドを簡単に使用できることに注意してください。
  • 最後になりましたが、一部のJavaメソッドの呼び出しの前後に定型コードを追加する必要がある可能性が高く、適切な型/クラス変換などを行うために、Pythonの一部のJavaメソッドをオーバーライドする可能性があります。したがって、Javaクラスを継承するのではなくラップする場合と同じようにJavaメソッドのPythonメソッドを作成することになりますが、A)メソッドの名前を変更するB) dictをクリーンに保つことができます。 グラフclass Elementclass Nodeclass Relationshipのメソッドを見てください。ほとんどの場合、APIをよりPythonicにするためであっても、ほとんどすべてに定型コードがあります;)

パフォーマンスの観点からは、影響はないと思いますが、 @ tshirtmanの方がよく知っているかもしれません。

もう1つ、Javaオブジェクトのラップは、現在、非常にうまく機能しています:-)

今のところ、Pythonコードを使用してJavaメソッドをオーバーライドすることは可能ですか?
Javaクラスの継承はどうですか?

私はこれを調べるのにかなりの時間を費やしました、そして私はそれを行うための実用的な方法はなく、実行時にJavaバイトコードを生成する以外にそれを行うためのライブラリがあるという結論に達しました、しかしそれは追加するように感じましたライブラリに多くの複雑さがあり、おそらく範囲外です。 締めくくりについてはよくわかりませんが、うまくいくとは思わないので、wontfixとしてマークするのは不合理ではありません。

@ monami7001何か進歩はありますか?

それは約4年前のことであり、私の知る限り、実行時にJavaバイトコードを生成することは依然として唯一の選択肢のように見えます(おそらく私ほど悪くはないので、それを調べる必要があります)。

1つの回避策は次のとおりです。

  1. ターゲットのAndroidバージョンAPIのandroid.jarを含む個別のJavaプロジェクトを作成します
  2. コードを実装します(継承/オーバーライド...)
  3. jarにエクスポート
  4. buildozerにインポート

自動クラスで使用するには

このページは役に立ちましたか?
0 / 5 - 0 評価