2017-02-12 54 views
0

我有这样一个抽象方面:AspectJ的 - 不能覆盖的切入点 - 参数类型不匹配

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是一个接口):

​​

但是我有这样的编译错误:

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

我怎样才能解决这个问题呢?

回答

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

Helper类:

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

控制台日志:

[email protected] 

请注意方面踢,否则null此处将打印。

+0

谢谢,它为我工作。另一个可能的变体是用'Object [] args = thisJoinPoint.getArgs();' – EstevaoLuis

+0

从around建议中获取args,但是由于需要遍历由'getArgs'返回的'Object []' 。在你的例子中,你可以通过Object [] methodArgs =(Object [])thisJoinPoint.getArgs()[0];'获得自己的'Object []'作为第一个方法参数。我更喜欢没有铸造的更安全的解决方案。它还具有将切入点匹配限制在真正具有一个'Object''参数的方法的优点。不使用'args()',而只使用'getArgs()'意味着if-else,迭代,加上大量的字节码在不需要的地方编织。 – kriegaex