2017-02-12 12 views
0

は、私はこのような抽象的側面を持って一致していません - ポイントカット上書きすることはできませんポイントカット。次の例(fooがインターフェイスである場合)と同様:AspectJの - パラメータ型が

​​

しかし、私は、このコンパイルエラーを持っている:

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

ヘルパークラス:

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();'を使ってaround adviceからargsを取得することです。 – EstevaoLuis

+0

'getArgs'によって返される' Object [] 'を反復処理する必要があるので、 。あなたの例では、 'Object [] methodArgs =(Object [])thisJoinPoint.getArgs()[0];によって最初のメソッドパラメータとして独自の' Object [] 'を取得します。私はキャスティングなしで、より安全なソリューションを好む。また、実際にはちょうど1つの 'Object []'パラメータを持つシグネチャを持つメソッドへのポイントカットマッチングを制限するという利点があります。 'args()'を使用せず、 'getArgs()'だけはif-else、iterating、casting、そして不要な場所でのバイトコードの作成を意味します。 – kriegaex

関連する問題