AspectJ - 从within子句中排除内部类

时间:2017-07-05 16:31:58

标签: java aspectj

我有一个标记界面,有几个实现。我的目的是为实现该标记接口的任何类中定义的所有公共方法添加一个方面。 我将我的方面定义如下:

@Around("within(x.y.z.MyInterface+) && execution(public * *(..))")

问题是这也会捕获内部类,例如在实现该接口的一个类中考虑此方法:

public void foo() {
  doSomething(new Request() {
    @Override
    public void do() {
      System.out.println("Hi");
    }
  });
}

由于某种原因,该方面也捕获了" do()"方法,即使它不是从MyInterface继承。

我应该如何修复方面定义?

1 个答案:

答案 0 :(得分:1)

而不是"within"使用"this"切入点:

@Around("this(x.y.z.MyInterface+) && execution(public * *(..))")

基本上"this"匹配 this 的连接点,当前的当前对象引用是MyInterface的一个实例。未实现您的界面的匿名类将不再匹配。

JavaWorld上有一篇很好的文章: http://www.javaworld.com/article/2074048/core-java/i-want-my-aop---part-2.html?page=2