0

@SecureObjectのようなアノテーションがあり、一部のクラスに適用される可能性があります。さらに、次のようなメソッドを提供するORMがあります

public ObjectID get(Class paramClass、Object object);

次に、アスペクトを作成する必要があります。これは、paramClassに@SecureObjectの注釈が付けられている場合にのみトリガーされます。

次のような簡単なソリューション:

@Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))"
   void runBefore() {
     // method code
}

動作しません-メソッドが呼び出されることはありません。しかし有線(aspectj -debugでチェック)。

AspectJでそのような動作を実現することは可能ですか?もしそうなら-どのように?

4

1 に答える 1

1

問題は、メソッドの最初のパラメーターがget()タイプであるということClassです。

そのため、アノテーションベースのメソッドシグネチャパターンを使用することはできません。考えられる解決策の1つは、 if()ポイントカット式を使用することです。

package aspects;

@Aspect
public class MyAspect {

    @Pointcut("if() && call(public * some.orm.Datastore.get(..)) && args(paramClass,..)")
    public static boolean runBefore(JoinPoint jp, Class paramClass) {
         return paramClass.isAnnotationPresent(annotation.SecureObject.class);
    }

    @Before("runBefore(jp, paramClass)")
    public void runBeforeAdvice(JoinPoint jp, Class paramClass) {
        System.out.println("annotated!");
    }
}

注:このポイントカットは、@ SecureObjectアノテーションが存在しない場合にもトリガーされますが、if()条件は実行時に評価されます。

于 2012-05-03T09:12:28.743 に答える