【发布时间】:2012-07-02 11:02:00
【问题描述】:
我正在使用 X.jar 并添加到我的 AspectJ 项目(在 Eclipse 中)。我已经为 X.jar 中的方法 myMethod() 编写了切入点和建议。
但是 aspectj 并没有拦截这个方法调用。
我如何告诉 aspectj 拦截外部 jar 上的方法调用。还是不可能?
谢谢
【问题讨论】:
标签: aspectj
我正在使用 X.jar 并添加到我的 AspectJ 项目(在 Eclipse 中)。我已经为 X.jar 中的方法 myMethod() 编写了切入点和建议。
但是 aspectj 并没有拦截这个方法调用。
我如何告诉 aspectj 拦截外部 jar 上的方法调用。还是不可能?
谢谢
【问题讨论】:
标签: aspectj
有两种选择:
a) 将方面编译到 JAR
b)使用加载时间编织(我会使用那个)
这两个都是高级主题,我建议您阅读AspectJ in Action (2nd Ed) by Ramnivas Laddad 以了解更多信息。
澄清一下:有不同类型的切入点。如果您的代码调用库的方法,您当然可以拦截这些调用,因为它们发生在您的代码中。所以call() 切入点会起作用,但execute()(和许多其他)切入点不会,因为它们会更改执行方法,而这不在您的代码库中。因此,您必须要么更改库的字节码(选项 a),要么更改将其加载到应用程序中的方式(选项 b)。
【讨论】:
这是一个简单的例子,在 GitHub https://github.com/medvedev1088/aspectj-ltw-example 上使用 AspectJ Load-Time Weaving@
它使用 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>
【讨论】: