4

CGLib、ASM、BCEL (アスペクト)、および Javassist を使用して、実行時にクラスにフィールドを追加することを検討しました....

頭を整理すると、これらのバイトコード操作者は実際のクラスを更新せず、ユーザーが変更をダンプすることしかできないようです (CGLib や writeFile メソッドの場合と同様)。(a)(BCELでInputStreamを実行するのではなく)クラスをロードし、(b)クラスを更新するソリューションを見つけることを望んでいました。

多分これは正常ですか?人々は通常、プロキシを作成し、プロキシを渡しますか?

私がやりたいことは、特定の注釈を持つフィールド (プロパティではない) を探すフレームワークにオブジェクトを渡す前に、フィールド (注: get/set メソッドによるプロパティではない) を追加することです。したがって、「クライアント」は、追加のフィールドを挿入したいターゲット クラスを作成しています。これらのオブジェクトを操作したいサービス層への AOP 呼び出しをインターセプトします。

4

1 に答える 1

2

Intrumentation を使用してクラスを再定義できます。ただし、一般的な制限は、使用するフィールドを変更できないことです。これは、一度作成されたオブジェクトの内容を変更 (または追加) できないためです。

あなたの場合、次のことができます。

  • 提案どおりにプロキシを作成しますが、プロキシはインターフェースである必要があります。
  • 追加のフィールドを持つサブクラスを作成します
  • クラスがロードされる前にフィールドを追加します。
于 2012-08-06T12:24:40.313 に答える