2011-09-04 4 views
6

私たちは、プロジェクト間で使用するJavaコードのライブラリを用意しています。これらのプロジェクトの中には、このライブラリのJavaオブジェクトにアノテーションを追加する必要があります(つまり、あるプロジェクトではJAXB、JSONなどの注釈を付ける必要があるためJAX-RSサーブレットの実装で使用されます)。私が抱えている問題は、元のライブラリを変更せずにこれらの注釈を追加する方法を理解できなかったことです。Javaプロジェクトでアノテーションを追加/変更する

この例考えてみましょう:いくつかのプロジェクトで

public class MyClass 
{ 
    private String field1; 
    private int field2; 
} 

を、私はそれが最初は私が個別に注釈を付けているインターフェイスや派生クラスを使用して考えた

public class MyClass 
{ 
    @Annotation1 
    private String field1; 
    @Annotation2 
    private int field2; 
} 

たかのように動作するクラスを希望しますそれを行う方法(または可能かどうか)を理解することができませんでした。また、Javassistの提案であるin this thread(Javaバイトコード操作アプローチ)についても説明しましたが、問題はAndroidクライアントでも同様に動作する必要があるため、私の選択肢ではありません。この時点で私はアイデアがありません。

誰かが何らかの助けになると感謝します。たぶん私は何かを見逃している、あるいは私がしようとしていることが正しい方法ではないかもしれない。いずれにしても、私は進んでいくためにいくつかの指導が必要です。

ありがとうございます。

+0

元のライブラリを変更することで問題は何ですか?私の言うとおり、あなたのコードです。 – CommonsWare

+0

ライブラリは、多数のオブジェクト、そのコレクション、およびメモリ内のCRUD機能(制約、検証など)を管理します。これらのオブジェクトのシリアライゼーションと永続性についての知識はありません。これらのオブジェクトを別々にしておきたいと思います。また、使用できないアノテーションは、ターゲットプラットフォームで問題を引き起こす可能性があります.AnnnnnはJAXBアノテーションを持たず、アノテーションを処理するフレームワークは、JAXBアノテーションが使用されていなくても(NoClassDefFoundError)、Androidで失敗します。アノテーションをターゲットプラットフォームで使用しない場合は、アノテーションを追加しないでください。 – alokoko

答えて

4

私はこれ以上に見て、要約として、ここで私が見つけたものです:

  • Java言語では、実行時に注釈を変更することはできません。
  • Javassistを使用してJavaバイトコードを変更できますが、Androidなどのプラットフォームでは機能しません。
  • ASMを使用できますが、これにはJavaアセンブリの処理が含まれます(例:http://community.jboss.org/thread/150002)。

主にAndroid上にJAXBが存在しないため(その他の理由で)、私たちはJSONに切り替えて、実装としてJacksonを使い始めました。この変更のメリットの1つは、ジャクソンが「混合注釈」と呼んでいるものを使用することでした。これはまさに私が探していたものです。ここで

は、より多くのことを説明したリンクです:http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0

実行時に.classバイトコードをハッキングしないことは、これができません。ランタイム中にライブラリクラスのバイトコードを実際に動的に変更したい場合はJavassistを使用できますが、大きな画像ではこれはひどく爆発するでしょう。

私は、ライブラリに注釈を付け、コードベースであれば再コンパイルすることをお勧めします。そうでない場合でも、継承を介して独自のクラス/インタフェースにライブラリクラス/インタフェースをラップしてそこに注釈を付けることができます。いずれにしても、ランタイムバイトコードハッキングよりもコードに注釈を付けるほうがよいと思います。ボーナスが追加され、ソースのアノテーションがIDEによって認識され、IDEがより良いサポートを可能にします。

+0

質問に私のコメントを参照してください。私はすでにJavassistについて知っていますが、Androidプラットフォームでも動作する必要があります.JavassistはAndroidで動作しません。 – alokoko

関連する問題