2012-01-15 18 views
11

私はJavaで私の最初の本当のプロジェクトに取り組んでいます。私は言語に慣れ始めていますが、私は動的言語の経験が豊富です。Javaメタプログラミング

私は次のように振る舞うクラスがあります。

class Single 
{ 
    public void doActionA() {} 
    public void doActionB() {} 
    public void doActionC() {} 
} 

をそして私は(具体的には、これらのクラスの集合体として機能SingleListクラス2Dスプライトライブラリのためだ、と」しています「行動」は、回転、せん断、スケールなどのあらゆる種類の変換です。私は、次の操作を実行できるようにしたい:

class SingleList 
{ 
    public void doActionA() { 
     for (Single s : _innerList) { 
      s.doActionA(); 
     } 
    } 

    ... etc ... 
} 

は単に内側のリストの各メンバーにメソッド(またはメソッドの知られているリスト)を延期する方法はありますか?どの方法でも、各メソッドを具体的にリストする必要はなく、各内部メンバーをループして手動で適用できますか?

方法を少し難しくするために、方法はさまざまですが、すべてが戻り値の型 "void"です。

+0

私はあなたが実行時にメソッドを呼び出すことができますJavaリフレクション、見てみることができると思います。 – Alvin

+0

しかし、私はまだ、すべてのメソッドスタブをSingleListクラスで生成する必要があります。私はキャッチオール呼び出しメソッドとして機能するソリューションを探しています。 PHPやpython getattrでの呼び出しとほとんど同じです。 – efritz

+0

ああ、あなたは、リフレクションを使ってSingleList.get( "someAttr")を行うことができます。リフレクションはあなたのためにgetSomeAttr()メソッドを呼び出します。あなたはGoogleの "org.springframework.beans.BeanUtils"を使うことができます。誰も私にそれを打ち負かさなければ正式な答えとしての例を書きます。 – Alvin

答えて

11

残念ながら、Javaは実行時にクラス作成を容易にサポートしません。SingleListは、Singleクラスに一致する必要なスタブメソッドで自動的に更新する必要があります。

私はこの問題に以下のアプローチを考えることができます:

  1. 使用Java reflection

    • 長所:
      • これは、Java言語で容易に利用可能です、あなたは簡単に見つけることができますドキュメンテーションとサンプル。
    • 短所:
      • SingleListクラスはそれ以上Singleクラスインターフェースと互換性がないであろう。
      • JavaコンパイラとIDEは、通常、リフレクションと呼ばれるメソッドをサポートすることができません。コンパイラによってキャッチされるエラーは、通常、実行時例外に変換されます。
      • ユースケースによっては、パフォーマンスが著しく低下することもあります。
  2. 自動的SingleList.javaファイルを作成するために、ソースコードジェネレータのいくつかの並べ替えと一緒にビルドシステムを使用してください。

    • 長所:
      • あなたがそれを設定したら、もはやそれに対処する必要はありません。
    • 短所:
      • これを設定するには、難易度を持っています。
      • SingleListクラスは、実際にロードされたSingleクラスと一致するように、任意のJVMまたはIDEにロードされていることを個別に確認する必要があります。
  3. 手動でこの問題に取り組む - まともなIDEが実装されていない方法を指摘するので、インターフェースを作成する(例えばSingleInterface)または両方のクラスで使用するためのベース抽象クラスが役立ちます。適切なクラスのアーキテクチャは重複したコードを最小限に抑え、IDEは定型部分を生成するのに役立つかもしれません。

    • 長所:
      • 以上を取得するには何のセットアップ曲線はありません。
      • IDEには、常に適切なクラスが表示されます。
      • 通常、クラスアーキテクチャは後で改善されます。
    • 短所:
      • すべてがマニュアルです。
  4. 動的にオンザフライSingleListクラスを修正/生成するようJavassistまたはBCELとしてバイトコード生成ライブラリを使用。

    • 長所:
      • この方法は非常に強力で、長期的に多くの時間を節約することができます。
    • 短所:
      • 使用バイトコード生成ライブラリーは、典型的には、かすかな心を持ったため、些細なことではないないあります。
      • コードの書き方によっては、IDEとダイナミッククラスの処理に問題がある場合もあります。
+0

手動アプローチのように見える方法です。それ以上の変換を加えれば、インターフェイスを最新の状態に保つようにしなければなりません。 – efritz

関連する問題