16

X.jarを使用して、AspectJプロジェクトに追加しています(Eclipseで)。X.jar内のメソッドmyMethod()のポイントカットとアドバイスを作成しました。

しかし、aspectjはこのメソッド呼び出しをインターセプトしていません。

外部jarのメソッド呼び出しをインターセプトするようにaspectjに指示するにはどうすればよいですか?それとも不可能ですか?

ありがとう

4

2 に答える 2

11

2つのオプションがあります。

a)アスペクトをJARにコンパイルします
b)ロードタイムウィービングを使用します(私はそれを使用します)

これらはどちらも高度なトピックです。詳細については、ラムニヴァス・ラダッドのAspectJ in Action(2nd Ed)をお読みになることをお勧めします。

明確にするために:ポイントカットにはさまざまな種類があります。コードがライブラリのメソッドを呼び出す場合は、もちろん、コードで発生するように、これらの呼び出しをインターセプトできます。したがってcall()、ポイントカットは機能しますが、execute()(および他の多くの)ポイントカットは、コードベースにない実行メソッドを変更するため機能しません。したがって、ライブラリのバイトコードを変更するか(オプションa)、アプリケーションへのロード方法を変更する必要があります(オプションb)。

于 2012-07-02T11:05:05.503 に答える
3

これは、GitHubでのAspectJロードタイムウィービングの簡単な例ですhttps://github.com/medvedev1088/aspectj-ltw-example

Joda Timeライブラリを使用して、DateTime#toString()メソッドの呼び出しをインターセプトする方法を示します。

側面:

@Aspect
public class DateTimeToStringAspect {

    public static final String TO_STRING_RESULT = "test";

    @Pointcut("execution(* org.joda.time.base.AbstractDateTime.toString())")
    public void dateTimeToString() {
    }

    @Around("dateTimeToString()")
    public Object toLowerCase(ProceedingJoinPoint joinPoint) throws Throwable {
        Object ignoredToStringResult = joinPoint.proceed();
        System.out.println("DateTime#toString() has been invoked: " + ignoredToStringResult);
        return TO_STRING_RESULT;
    }
}

aop.xml

<aspectj>

    <aspects>
        <!-- Aspects -->
        <aspect name="com.example.aspectj.DateTimeToStringAspect"/>
    </aspects>

    <weaver options="-verbose -showWeaveInfo">
        <include within="org.joda.time.base.AbstractDateTime"/>
    </weaver>

</aspectj>

テスト:

public class DateTimeToStringAspectTest {
    @Test
    public void testDateTimeToString() throws Exception {
        assertThat(new DateTime().toString(), is(DateTimeToStringAspect.TO_STRING_RESULT));
    }
}

pom.xmlからのSurefireプラグイン構成:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-XX:-UseSplitVerifier</argLine>
        <argLine>-javaagent:${user.home}/.m2/repository/org/aspectj/aspectjweaver/${aspectjweaver.version}/aspectjweaver-${aspectjweaver.version}.jar</argLine>
    </configuration>
</plugin>
于 2015-05-05T10:09:08.327 に答える