2017-02-12 24 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