0

私はAspectJアノテーションを使用していますが、何らかの理由で、ポイントカットの解決範囲が名前付きポイントカットと匿名ポイントカットで異なるようです。

たとえば、以下のコードでは、匿名の場合は同じポイントカットが解決されますが、名前が付けられている場合は解決されません。ただし、特定のタイプの代わりにワイルドカードを使用すると、名前付きポイントカットは一致します。

何かご意見は?

import some_other_package.not_the_one_where_this_aspect_is.Account;

@Aspect
public class MyClass {


//this does not match... but matches if Account is replaced by *
@Pointcut("execution(* Account.withdraw(..)) && args(amount)")
public void withdr(double amount){}

@Before("withdr(amount)")
public void dosomething1(double amount){}


//this matches
@Before("execution(* Account.withdraw(..)) && args(amount)")
public void dosomthing2(double amount){}

}
4

1 に答える 1

0

ドキュメントによると、@AspectJ構文ではインポートは役に立ちません。クラス名を完全に修飾するか、ジョーカーを使用する必要があります。2番目のケースでインポートが機能するということは、予想されるよりもむしろ予想される動作からの逸脱です。あなたはそれに頼ることはできません。

このようにすると、両方のバリアントが機能します。

@Aspect
public class AccountInterceptor {
    @Pointcut("execution(* *..Account.withdraw(..)) && args(amount)")
    public void withdraw(double amount) {}

    @Before("withdraw(amount)")
    public void doSomething1(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }

    @Before("execution(* *..Account.withdraw(..)) && args(amount)")
    public void doSomething2(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }
}
于 2013-04-04T11:52:21.120 に答える