0

POST 1: 理論的な質問

実際には、独自の Tomcat とそれを制御するためのシェル スクリプトを備えた Web モジュールである、いくつかのソフトウェアを使用します。プラグイン システムもあり、特定の構造を持つ .jar ファイルをアップロードしてアプリケーションに新しい機能を追加できます。

質問: メイン システム/アプリケーション (私の jar ではありません) のさまざまな呼び出しへの応答を制御し、実際に変更したいと考えています。AspectJ を使用してそれを行うことはできますか? なぜですか、そうでないのですか?メインアプリケーションのコードを変更することを除いて、他の一般的な可能性は何でしょうか.


投稿 2: 試してみる

私はこの方法でそれをやろうとしました(Eclipseで):

  • AspectJ プロジェクトでは、織り込むクラスがある jar ファイルを追加しました (実際には、INPATH に追加しました)。
  • プロジェクトを「Jar with AspectJ support」としてエクスポートしました
  • ステップ 2 でエクスポートした jar ファイルをデプロイしました。結果はありません。

質問:

  1. エクスポートされたアスペクト jar には、AspectJ プロジェクトの .class ファイルのみがあり、INPATH-Jar の .class ファイルはありません。インポートされた INPATH-jar から、他のクラスが必要ですか?

  2. エクスポートされたアスペクト jar には、アスペクト j ランタイム (aspectj-rt.jar) を含む jar はありません。そこにあるはずですか、それとも仮想マシンを構成する方法はありますか?

4

1 に答える 1

1

はい、なぜですか?質問を拡張して、システム内にどのアクターとアクションがあるか (おそらく例を挙げて) 説明していただければ、より具体的な方法でお手伝いできるかもしれません。でも基本的には問題ないと思います。JAR モジュールは動的にロードされる可能性がありますが、Tomcat アプリ内のどの呼び出しをインターセプトするかがわかっている場合は、既存のクラスを再編成して静的に、または JVM の起動時に LTW (ロード時間ウィービング) を介して動的に簡単に計測できます。 . アップロードされた JAR モジュールに触れる必要はありません。これは、私が理解しているように、回避したいことです。

おそらく、メイン アプリケーションのターゲット クラスを

  • execution(<methodsToBeChecked>)ポイントカットとの組み合わせ
  • around()アドバイス。

他の詳細は、特定のユースケース、パッケージ、クラスとメソッドの名前、パラメーターなどによって異なります。aroundアドバイスは、次のことの1つまたはいくつかを実行できます。

  • 発信者を特定し、
  • 呼び出しパラメーターを確認し、
  • 呼び出しパラメータを操作する
  • 元のまたは変更されたパラメーターで元のターゲットを呼び出します。
  • または、元の呼び出しをまったく実行しない、
  • 元の呼び出しの結果を呼び出し元に返します。
  • 結果の操作されたバージョンを呼び出し元に返します。
  • 正しい戻り値の型を持つ合成値を呼び出し元に渡します。
  • 元の呼び出しで発生した例外をキャッチし、
  • 独自の例外をスローする

あなたの空想 (および AspectJ のいくつかの制限) が限界です。:-)

于 2012-08-24T13:43:29.153 に答える