/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
サービスという名前のこのポイントカットは、サーバー オブジェクトのパブリック メソッドが呼び出されたときに、プログラムの実行中のポイントを選択します。また、サービス ポイントカットを使用するすべてのユーザーが、メソッドが呼び出されている Server オブジェクトにアクセスできるようになります。( https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.htmlから取得)
私は AspectJ のポイントカットを理解しようとしていますが、現時点ではかなり混乱しています。私の主な質問は、上記のポイントカットをどのように読み、その意味をどのように「パズル」しますか?
私の混乱を説明するために、ゼロから構築してみましょう。
次のポイントカットは、任意のオブジェクトへのすべてのパブリック メソッド呼び出しをインターセプトしますよね?
/* 1 */ pointcut services() : call(public * *(..))
さて、これはどうですか:
/* 2 */ pointcut services() : call(public * Server.*(..))
Server オブジェクトのパブリック メソッドが呼び出されると、任意のポイントがインターセプトされると思います。
では、ここから最初の例 0 に到達するにはどうすればよいでしょうか。で、どうやって読むの?
ポイントカットを構築するときに、最初にパラメーター リストを提供しますか?
/* 3a */ pointcut services(Server s) : call(public * *(..))
上の2番と同じですか?(私はそれが機能しないと感じています。もし機能した場合、番号 1 のように、すべてのパブリック メソッド呼び出しを「インターセプト」します。)とにかく、次は同じでしょうか? (私はs
まだネイティブのポイントカットで「キャプチャ」していないので、実際に定義することはできませんね?)
/* 4a */ pointcut services(Server /* only type, no variable */) : call(public * *(..))
または、次のように、ターゲット オブジェクトを「キャプチャ」するために、ネイティブ ポイントカットを指定することから始めますか。
/* 3b */ pointcut services() : target(s) && call(public * *(..))
任意のオブジェクトのすべてのパブリック メソッド呼び出しをまだインターセプトすると思いますか?
以下は、Server オブジェクトの呼び出しのみをインターセプトし、そのオブジェクトを "キャプチャ" するために機能しますか?
/* 5 */ pointcut services(/*nothing here*/) : target(s) && call(public * Server.*(..))
ここで、元のポイントカットに戻ります。
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..))
と同じですか
/* 6 */ pointcut services(Server s): target(s) && call(public * Server.*(..))
要約すると、0 の解読をどのように開始しますか?
最初にポイントカットを見てtarget
、次にポイントカットのパラメータータイプを見て、 services
「裏返し」/「右から左」に読みますか? それとも、最初にパラメータ リストを調べてから、services
ポイントカットを調べて、引数がどこから来たのか (つまりtarget(s)
) を調べますか?
それとも、これを複雑にしすぎていますか?これを理解するのに役立つ重要な部分がどこかに欠けていますか?
編集:Server s
マニュアルでは左から右に説明していますが、まだ「実行」していない場合、パラメータへの引数はどこから来るのtarget(s)
でしょうか?