我使用的是X.jar并添加到我的AspectJ项目(在Eclipse)。 我已经写了切入点和通知的方法myMethod的()内X.jar。
但是,AspectJ是不拦截此方法调用。
我怎么能告诉AspectJ进行外部jars.Or拦截方法调用是不可能的?
谢谢
我使用的是X.jar并添加到我的AspectJ项目(在Eclipse)。 我已经写了切入点和通知的方法myMethod的()内X.jar。
但是,AspectJ是不拦截此方法调用。
我怎么能告诉AspectJ进行外部jars.Or拦截方法调用是不可能的?
谢谢
有两个选项:
A)编译方面进JAR
B)使用加载时间编织(我有一个去)
这两者都是高级的主题,我建议你读通过拉姆尼瓦斯·拉达的AspectJ在行动(第二版) ,以了解更多信息。
为了澄清:有不同类型的切入点。 如果你的代码调用库的方法,当然你也可以拦截这些调用,因为它们发生在你的代码。 所以call()
切入点的工作,但execute()
和许多其他)切入点不会因为他们改变了执行的方法,这是不是在你的代码库。 所以,你必须要么改变图书馆(选项)的字节代码或改变它是如何加载到你的应用程序(选项B)。
这里是AspectJ装载时编织在GitHub上一个简单的例子https://github.com/medvedev1088/aspectj-ltw-example
它使用约达时间库来演示如何截获的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的神火插件配置:
<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>