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

标签 java overriding 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 是一个接口(interface)):

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() 绑定(bind)移动到通知中而不是切入点中?

驱动程序应用程序:

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

关于java - AspectJ - 无法覆盖切入点 - 参数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189466/

相关文章:

java - 这对 sftp : java or shell script? 更有效

ruby-on-rails - 如何重写类范围内声明的方法?

python - 如何检测python子类中的方法重载?

java - Files.walk.filter 和 Files.find 有什么区别?

java - 可执行jar文件不执行

java - Spring security Remember-me 无法正常工作,数据库表无法正常工作

c# - 泛型方法继承 : VS and Xamarin Studio yield different results; which is right?

Java MDC 记录器 - MDC.put() 过多的方法

java - 在AspectJ中排除带注释的方法

inversion-of-control - AOP 使用 Windsor 和批量注册类