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

时间:2017-02-12 15:32:28

标签: java override aop aspectj pointcut

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

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);
}

但我有这个编译错误:

  

无法使用切入点覆盖切入点GenericAspect.callMethod(java.lang.Object [])FooAspect.callMethod(java.lang.Object [])参数不匹配

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不知道为什么你的例子不起作用,也许在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;
  }
}

助手类:

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