【问题标题】:Aspectj: intercept method from external jarAspectj:来自外部 jar 的拦截方法
【发布时间】:2012-07-02 11:02:00
【问题描述】:

我正在使用 X.jar 并添加到我的 AspectJ 项目(在 Eclipse 中)。我已经为 X.jar 中的方法 myMethod() 编写了切入点和建议。

但是 aspectj 并没有拦截这个方法调用。

我如何告诉 aspectj 拦截外部 jar 上的方法调用。还是不可能?

谢谢

【问题讨论】:

    标签: aspectj


    【解决方案1】:

    有两种选择:

    a) 将方面编译到 JAR
    b)使用加载时间编织(我会使用那个)

    这两个都是高级主题,我建议您阅读AspectJ in Action (2nd Ed) by Ramnivas Laddad 以了解更多信息。

    澄清一下:有不同类型的切入点。如果您的代码调用库的方法,您当然可以拦截这些调用,因为它们发生在您的代码中。所以call() 切入点会起作用,但execute()(和许多其他)切入点不会,因为它们会更改执行方法,而这不在您的代码库中。因此,您必须要么更改库的字节码(选项 a),要么更改将其加载到应用程序中的方式(选项 b)。

    【讨论】:

    • 谢谢。我将尝试使用 call() 切入点。认为这对我来说是一个简单的选择
    • 嗨 Sean Patrick,它适用于所有版本的 Aspectj 吗?它适用于 Aspectj 1.5.3,但不适用于 1.1.3。
    • @sonic 我不知道,我从未使用过任何早于 1.6.x 的 AspectJ 版本
    • 我以非常规的方式克服了这个问题。在外部 jar 上的方法调用前后创建了两个空函数。并为此添加了切入点。
    【解决方案2】:

    这是一个简单的例子,在 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>
    

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多