1

EclipseLinkのクラスのメソッドを乗っ取ったり傍受したりしようとしています。Spring AOPとAspectJを試しましたが、失敗しました。以下のようにメソッドMyの実装org.eclipse.persistence.internal.localization.i18n.TraceLocalizationResourceを呼び出しているときにクラスが例外をスローしたときに何かをしたい:getString(..);

@AfterThrowing(pointcut = "execution(* org.eclipse.persistence.internal.localization.i18n.TraceLocalizationResource.getString(..))",throwing="error")
    public void logAfterThrowing(JoinPoint joinPoint,Throwable error) {
....
}

そしてcalssTraceLocalizationResourceが呼び出されました(私はそれにデバッグします)。しかし、ハイジャックメソッドは呼び出されませんでした。

私の質問:

  1. 私はそれを間違った方法でやっていたのですか?
  2. ハイジャックまたはインターセプトするターゲットクラスは、自己定義型である必要がありますか?
  3. java.lang.StringのようなJDKのクラスをハイジャックしたい場合はどうなりますか?
4

2 に答える 2

2
  1. 基本的に構文は問題ないように見えますが、ここでコードスニペットから完全な側面を複製しようとはしていません。さらに、私はネイティブのAspectJ構文のみを使用しており、注釈ベースの構文に精通していないため、問題が発生した場合は、それを見たことがない可能性があります。

  2. いいえ。ただし、メインアプリケーションで使用されるライブラリ(JARまたはファイルシステムにアンパック)をウィーブする場合は、ウィーバーのインパスにあることを確認する必要があります。構文については、AspectJのドキュメントを参照してください。編集:私は今日の初めに別の回答でいくつかの役立つリンクを投稿しました。

  3. デフォルトでは、パッケージorg.aspectjjavaおよびjavaxはウィービングから除外されます。後者の2つには、織りを有効にするコマンドラインスイッチがあります。しかし、LTWはせいぜいトリッキーで、最悪の場合はa **(ほぼ不可能)に苦痛を伴います。これは、鶏と卵の問題があるためです。AspectJウィーバーランタイムクラスにはJDKが必要であり、JDKブートストラップはJavaの前に発生します。ウィーバーのようなエージェントが付属しています。したがって、最善の策は、JDKクラスのコンパイル時のウィービングと、後でアプリケーションの後半でウィービングされたrt.jarを使用することです。コンパイル時のウィービングでも、アドバイスでJDKウィービングクラス自体を使用すると、問題が発生する可能性があります。そこでは無限の再帰を避けたいと思います。しかし、それは可能です。

    更新: AspectJをしばらく使用している人にとっては簡単すぎると思われる別のヒント:executionターゲットクラスを織り込む必要があるポイントカットの代わりに、 call(名前が示すように)呼び出しをインターセプトするポイントカットを使用することができますクライアントクラスのあらゆる場所のターゲットに。少し効率が悪いかもしれませんが、JDKを織り込む手間を本当にかけたくない場合を除いて、おそらく最善かつ最も簡単な方法です。

于 2012-08-22T11:19:41.467 に答える
2

サードパーティのライブラリを作成することは可能ですが、aspectj-maven-pluginプラグインを構成する必要があります。

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.8.9</version>
    </dependency>

     <dependency>
      <groupId>org.agroup</groupId>
      <artifactId>to-weave</artifactId>
      <version>1.0</version>
    </dependency>

    <dependency>
      <groupId>org.anothergroup</groupId>
      <artifactId>gen</artifactId>
      <version>1.0</version>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.9</version>
        <configuration>
          <weaveDependencies>
            <weaveDependency>
              <groupId>org.agroup</groupId>
              <artifactId>to-weave</artifactId>
            </weaveDependency>
            <weaveDependency>
              <groupId>org.anothergroup</groupId>
              <artifactId>gen</artifactId>
            </weaveDependency>
          </weaveDependencies>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  <build>
  ...
</project>

ソース:http ://www.mojohaus.org/aspectj-maven-plugin/examples/weaveJars.html

于 2016-12-27T17:24:09.327 に答える