問題タブ [pointcuts]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - AspectJ ポイントカットを読んで理解していますか?
サービスという名前のこのポイントカットは、サーバー オブジェクトのパブリック メソッドが呼び出されたときに、プログラムの実行中のポイントを選択します。また、サービス ポイントカットを使用するすべてのユーザーが、メソッドが呼び出されている Server オブジェクトにアクセスできるようになります。( https://eclipse.org/aspectj/doc/released/progguide/language-anatomy.htmlから取得)
私は AspectJ のポイントカットを理解しようとしていますが、現時点ではかなり混乱しています。私の主な質問は、上記のポイントカットをどのように読み、その意味をどのように「パズル」しますか?
私の混乱を説明するために、ゼロから構築してみましょう。
次のポイントカットは、任意のオブジェクトへのすべてのパブリック メソッド呼び出しをインターセプトしますよね?
さて、これはどうですか:
Server オブジェクトのパブリック メソッドが呼び出されると、任意のポイントがインターセプトされると思います。
では、ここから最初の例 0 に到達するにはどうすればよいでしょうか。で、どうやって読むの?
ポイントカットを構築するときに、最初にパラメーター リストを提供しますか?
上の2番と同じですか?(私はそれが機能しないと感じています。もし機能した場合、番号 1 のように、すべてのパブリック メソッド呼び出しを「インターセプト」します。)とにかく、次は同じでしょうか? (私はs
まだネイティブのポイントカットで「キャプチャ」していないので、実際に定義することはできませんね?)
または、次のように、ターゲット オブジェクトを「キャプチャ」するために、ネイティブ ポイントカットを指定することから始めますか。
任意のオブジェクトのすべてのパブリック メソッド呼び出しをまだインターセプトすると思いますか?
以下は、Server オブジェクトの呼び出しのみをインターセプトし、そのオブジェクトを "キャプチャ" するために機能しますか?
ここで、元のポイントカットに戻ります。
と同じですか
要約すると、0 の解読をどのように開始しますか?
最初にポイントカットを見てtarget
、次にポイントカットのパラメータータイプを見て、 services
「裏返し」/「右から左」に読みますか? それとも、最初にパラメータ リストを調べてから、services
ポイントカットを調べて、引数がどこから来たのか (つまりtarget(s)
) を調べますか?
それとも、これを複雑にしすぎていますか?これを理解するのに役立つ重要な部分がどこかに欠けていますか?
編集:Server s
マニュアルでは左から右に説明していますが、まだ「実行」していない場合、パラメータへの引数はどこから来るのtarget(s)
でしょうか?
java - 春にフル機能のアスペクトを有効にする方法
春のプロジェクトでフル機能のアスペクトを有効にして、条件付きポイントカットを使用できるようにするにはどうすればよいですか?
今、私は設定ファイルに持っています:
....
しかし、次のようなポイントカットを作成したい場合:
次のようなコンパイル例外があります: ポイントカット式 'execution(public * *(..)) && if() ' にはサポートされていないポイントカット プリミティブ 'if' が含まれています。
では、Spring AOP ではなく、aspectj AOP を使用するにはどうすればよいですか?
java - AspectJ のパラメーター化された型がターゲット ポイントカットをサポートしていない
リスト インターフェイス内のメソッドにポイントカットするクラスを作成したいと思います。これは、ターゲット(リスト)をアドバイスに追加するまで機能するようです。追加の前後にリストの要素を表示して、(たとえば)何が変更されたかを確認したいのですが、オブジェクトのようにリストを渡すことができないようです。これは私がこれまでに持っているものです。これは target(list) では実行されませんが、それなしでは実行されます:
java - AspectJ: アノテーション付きサブクラス インスタンスの GenericServlet.init() 呼び出しの一致
私は GenericServlet から派生しており、その派生クラスに @Tx で注釈を付けています。サーブレットの起動時に GenericServlet.init() メソッド呼び出しを使用して、aop を介してサーブレットの外部で初期化をトリガーしたいと考えています。最初の 2 行はまったく一致しません。3 行目は明らかにすべてのサーブレットに一致し、4 行目はアノテーションを使用してターゲットを指定しているにもかかわらず、すべてのサーブレットに一致します。
GenericServlet+.init() を GenericServlet.init(..) に置き換えると、この最初の行が機能します
デバッガーを使用すると、 GenericServlet.init() は確実に GenericServlet.init(ServletConfig) から呼び出されるため、これは奇妙です...
ここで何が起こっているのか、誰かが明確にしてもらえますか? 最初の行でうまくいくと思いますが、そうではありません。
私の最善の推測は、Jetty インスタンス自体と webapp のクラス ローダーによって使用されるクラス ローダーの分離に関係しているということです...少なくとも次のように init() メソッドを織り込むことができました (maspectj のデバッグ出力によると)。 :
しかし、それはトリガーしません。
アップデート
私はこれまで問題をたどりました: URLClassLoader は注釈を com.sun.$Proxy$27 としてロードします。
基本的に、foo.getClass().isAnnotationPresent(Tx.class) は常に false を返します。ここで問題は次のとおりです。このナンセンスは何ですか? どうすれば無効にできますか?