我有一个像这样的抽象方面:
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/