9

私はアプリケーションサーバーを作成していますが、その中でいくつかのバイトコード操作を使用する必要があります (例:で注釈が付けられたクラスにカスタムequalsとメソッドを挿入する)。ここで、 ASMを使用してバイトコード変換を行う Java エージェント ( -javaagentオプション) をJVM に与えます。hashCode@Entity

OSGiの使用を検討していますが、必要なバイトコード操作を実行できるかどうかはわかりません。

  1. OSGi を使用しているときにバイトコード操作を行うことは可能ですか? どのように?
  2. バンドルが動作するために何らかのバイトコード操作が必要であることを宣言することは可能ですか? たとえば、アプリケーション サーバーでは、独自のコア クラスの一部を操作する必要があります。
  3. 他のバンドルが何らかのバイトコード操作を必要とすることを、そのバンドルが知らずに指定することは可能ですか? たとえば、サーバー上で実行されるすべてのアプリケーションは操作する必要がありますが、アプリケーションはそれを知る必要はありません。
  4. バンドルが依存するすべてのバンドルをバイトコードで操作する必要があることを宣言することは可能ですか? @Entityこれにより、アノテーションを含む API バンドルに依存するすべての人を操作する必要があることを簡単に宣言できます。
4

2 に答える 2

7

OSGI 4.3 では、選択したバイト コード マニピュレーターでバイト コード操作を実行できるWeavingHookが追加されました。プロジェクトの 1 つで JavaAssist と一緒に使用していますが、うまく機能します。

于 2011-10-25T19:55:59.227 に答える
3

1) はい、OSGi でバイトコード操作を行うことは可能です。方法は標準の Java とは少し異なります。ここで説明されているエクステンダー パターンを使用する必要がありますhttp://www.osgi.org/blog/2007/02/osgi-extender-model.html。私は、Eclipseが分点プロジェクトでそれを使用していると信じています: http://www.eclipse.org/equinox/incubator/aspects/Spring DMは間違いなくこのパターンを使用して osgi dm モジュールを自動構成しています。

2) それは、使用するエクステンダー パターン次第です。これは、プラットフォームによって開始される前に、バンドルの META-INF/spring フォルダーで構成ファイルを探して、Spring エクステンダーがどのように機能するかです。

3) 繰り返しますが、これは定義するエクステンダー次第です。

4)バンドルを開始する前に、バンドルを解決して依存関係を開始する必要があるため、これは可能だと思います。エクステンダーはバンドルの依存関係を分析し、バイトコード操作を開始できます。

于 2009-02-19T02:48:36.927 に答える