Aspectj: intercept method from external jar

2019-06-25 23:31发布

我使用的是X.jar并添加到我的AspectJ项目(在Eclipse)。 我已经写了切入点和通知的方法myMethod的()内X.jar。

但是,AspectJ是不拦截此方法调用。

我怎么能告诉AspectJ进行外部jars.Or拦截方法调用是不可能的?

谢谢

Answer 1:

有两个选项:

A)编译方面进JAR
B)使用加载时间编织(我有一个去)

这两者都是高级的主题,我建议你读通过拉姆尼瓦斯·拉达的AspectJ在行动(第二版) ,以了解更多信息。

为了澄清:有不同类型的切入点。 如果你的代码调用库的方法,当然你也可以拦截这些调用,因为它们发生在你的代码。 所以call()切入点的工作,但execute()和许多其他)切入点不会因为他们改变了执行的方法,这是不是在你的代码库。 所以,你必须要么改变图书馆(选项)的字节代码或改变它是如何加载到你的应用程序(选项B)。



Answer 2:

这里是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>


文章来源: Aspectj: intercept method from external jar
标签: aspectj