在成员访问和函数调用上定义切入点

时间:2010-12-01 13:28:16

标签: java aop aspectj

这很难解释,但我想在AspectJ中定义一个像这样的函数调用的切入点:

public class B{
    public A a;
}

public class A{
    public void foo(){...}
}

并且切入点应截取以下调用:

B.a.foo();

我还没有想出办法(如果有的话)。你们有什么想法吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

我自己也是一名AspectJ新手,但我觉得这是不可能的。即使你设计了一个匹配B.a.foo()的切入点,你仍然需要以某种方式处理以下情况:

A a = b.a;
a.foo();

甚至

public void fooA(A aToFoo) { aToFoo.foo(); }

public void whatever(B someB) { fooA(someB.a); }

答案 1 :(得分:0)

您可以定义一个切入点来捕获对公共字段的任何引用,但是AFAIK您无法创建一个将字段引用与该引用上的方法调用相结合的切入点。

答案 2 :(得分:0)

正如其他人所提到的,这在AspectJ中是不可能的。然而,AspectJ的一些研究扩展引入了tracecuts,这是一种新的切入点,能够完全按照你的要求进行操作。我不相信有任何生产准备好的实现,但您可能有兴趣阅读它。这里有一篇好文章:

http://lsmr.cpsc.ucalgary.ca/papers/walker-fse-2004.pdf