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
会打印在这里。
我有这样一个抽象的方面:
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
会打印在这里。