AspectJ - 从子句中排除内部 类

AspectJ - exclude inner classes from within clause

我有一个有多个实现的标记接口。我的意图是为实现该标记接口的任何 class 中定义的所有 public 方法添加一个方面。 我定义我的方面如下:

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

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

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

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

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

而不是 "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