X.jarを使用して、AspectJプロジェクトに追加しています(Eclipseで)。X.jar内のメソッドmyMethod()のポイントカットとアドバイスを作成しました。
しかし、aspectjはこのメソッド呼び出しをインターセプトしていません。
外部jarのメソッド呼び出しをインターセプトするようにaspectjに指示するにはどうすればよいですか?それとも不可能ですか?
ありがとう
X.jarを使用して、AspectJプロジェクトに追加しています(Eclipseで)。X.jar内のメソッドmyMethod()のポイントカットとアドバイスを作成しました。
しかし、aspectjはこのメソッド呼び出しをインターセプトしていません。
外部jarのメソッド呼び出しをインターセプトするようにaspectjに指示するにはどうすればよいですか?それとも不可能ですか?
ありがとう
2つのオプションがあります。
a)アスペクトをJARにコンパイルします
b)ロードタイムウィービングを使用します(私はそれを使用します)
これらはどちらも高度なトピックです。詳細については、ラムニヴァス・ラダッドのAspectJ in Action(2nd Ed)をお読みになることをお勧めします。
明確にするために:ポイントカットにはさまざまな種類があります。コードがライブラリのメソッドを呼び出す場合は、もちろん、コードで発生するように、これらの呼び出しをインターセプトできます。したがってcall()
、ポイントカットは機能しますが、execute()
(および他の多くの)ポイントカットは、コードベースにない実行メソッドを変更するため機能しません。したがって、ライブラリのバイトコードを変更するか(オプションa)、アプリケーションへのロード方法を変更する必要があります(オプションb)。
これは、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>