1

ドメイン オブジェクトの認証チェックを行いたいと考えています。これには、誰かがオブジェクトのインスタンス化を許可されているかどうかのチェックが含まれます (オブジェクトのタイプに応じて - このチェックは外部で行われるため、これを解決する必要はありません)。

すべてのドメイン オブジェクトは、1 つの特定のインターフェイスを (直接的または間接的に) 実装します。

私が必要としているのは、ドメイン オブジェクトのインスタンス化の後に実行され、作成されたインスタンスを使用できるアドバイスです (権限の決定に必要です)。(さらに、コンストラクターが休止状態から呼び出されると、アドバイスが実行されない場合があります)

ランタイムに依存する変更がないため、理想的には静的分析のみを使用して、AspectJ(メソッドに対してはまだ機能しています)を使用してこれを実装したいと思います

今、コンストラクター呼び出しをインターセプトする @AfterReturning adivce を作成しようとしています。しかし、ポイントカットが機能しません。

私が試したこと:

@Pointcut("within(a.b.c.DomainObject+) && execution(*.new(..))")

@Pointcut("execution(a.b.c.DomainObject+.new(..))")

しかし、どちらも機能しません。

どうすればこれを達成できるか知っている人はいますか?

よろしくマイケル

4

1 に答える 1

0

同様のことを行う方法を理解するのに役立ついくつかの例を次に示します。http://www.eclipse.org/aspectj/sample-code.html

また、オブジェクトの作成後にリスナーを追加するために、テスト目的でプロジェクトにあるものを次に示します。

pointcut init(JComponent j):
    this(j) &&
    initialization(*.new());

after(JComponent j) returning: init(j) {
    if(j instanceof JButton && !(j instanceof AccessibleButton))
        System.out.println(j.toString() + thisJoinPointStaticPart.getSourceLocation());
    j.addFocusListener(new VisualFocusListener());
}

編集

this()上記は、コンストラクターが呼び出されるか呼び出されるか、またはによって呼び出されるかどうかに関係なく、コンストラクターが呼び出されるたびに実行されます-super()おそらくあなたが望むものではありません。コンストラクターから返されたオブジェクトを取得する別の方法を見つけました。

after() returning(JComponent j): call(*.new(..)) {
    //do something with j
}

これは英語でコードとほぼ同じように読めます: 「コンストラクターから JComponent を返した後、何かを行います」。*.new(..)JComponent が提供される限り、どのコンストラクターが呼び出されたか、またはどのパラメーターが必要かは気にしないためです。Foo.new(..)またはと言って、さらに制限することができますFoo.new(int)

于 2010-07-19T17:10:41.933 に答える