あなたの例がうまくいかない理由が分かりません。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
がここに印刷される、側面は内蹴ることに注意してください。
ありがとう、それは私のために働いた。もう一つの可能な変形は、 'Object [] args = thisJoinPoint.getArgs();'を使ってaround adviceからargsを取得することです。 – EstevaoLuis
'getArgs'によって返される' Object [] 'を反復処理する必要があるので、 。あなたの例では、 'Object [] methodArgs =(Object [])thisJoinPoint.getArgs()[0];によって最初のメソッドパラメータとして独自の' Object [] 'を取得します。私はキャスティングなしで、より安全なソリューションを好む。また、実際にはちょうど1つの 'Object []'パラメータを持つシグネチャを持つメソッドへのポイントカットマッチングを制限するという利点があります。 'args()'を使用せず、 'getArgs()'だけはif-else、iterating、casting、そして不要な場所でのバイトコードの作成を意味します。 – kriegaex