AspectJ - 无法覆盖切入点 - 参数类型不匹配

AspectJ - can't override pointcut - parameter types don't match

我有这样一个抽象的方面:

public abstract aspect GenericAspect<T> {

    public abstract T createT(Object[] args);

    abstract pointcut callMethod(Object[] args);

    T around(Object[] args) : callMethod(args) {
        return createT(args);
    }
}

而且我想将这个方面扩展到另一个只覆盖抽象切入点的抽象方面。像下面的例子(其中 Foo 是一个接口):

public abstract aspect FooAspect extends GenericAspect<Foo> {

    pointcut callMethod(Object[] args):
        call(Foo *.*(..)) && args(args);
}

但是我有这个编译错误:

can't override pointcut GenericAspect.callMethod(java.lang.Object[]) with pointcut FooAspect.callMethod(java.lang.Object[]) parameter don't match

我该如何解决这个问题?

我不知道为什么你的例子不起作用,也许 AspectJ 中有一个小错误,或者你只是对 AspectJ 结合泛型和抽象切入点的可能性做出了错误的假设。我建议你在 AspectJ users mailing list.

上问同样的问题

与此同时,您是否可以这样做,稍微修改语法并将 args() 绑定移动到通知而不是切入点?

驱动申请:

package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    System.out.println(new Application().createFoo());
  }

  public Foo createFoo(Object... args) {
    return null;
  }
}

帮手class:

package de.scrum_master.app;

public class Foo {}

方面:

package de.scrum_master.aspect;

public abstract aspect GenericAspect<T> {
  public abstract T createT(Object[] args);

  abstract pointcut callMethod();

  T around(Object[] args): callMethod() && args(args) {
    return createT(args);
  }
}
package de.scrum_master.aspect;

import de.scrum_master.app.Foo;

public abstract aspect FooAspect extends GenericAspect<Foo> {
  pointcut callMethod():
    call(Foo *(..));
}
package de.scrum_master.aspect;

import de.scrum_master.app.Foo;

public aspect ConcreteFooAspect extends FooAspect {
  @Override
  public Foo createT(Object[] args) {
    return new Foo();
  }
}

控制台日志:

de.scrum_master.app.Foo@511d50c0

请注意切面开始,否则null会打印在这里。