問題タブ [pointcut]
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 - ポイントカットの抽象型
アスペクトを持つ特定のシグネチャを持つメソッド呼び出しをインターセプトしたいと思います。
私のポイントカットは次のようになります。
execution(public Result * (Input))"
しかしResult
、Input
ですabstract
。
Result
このポイントカットは、のサブタイプを返し、のサブタイプで機能するすべてのメソッドにも一致しInput
ますか?それが私の意図だからです。
spring - Spring AOP アドバイス - デバッグ モードでの条件付き
AOPアドバイス/ポイントカットなどをデバッグモードでのみ使用したい(マスターグローバル構成として:たとえば、log4jがDEBUGしきい値にある場合)。
application.xml構成または他の場所でこれを行うにはどうすればよいですか?
私はAOPアノテーションを使用しています。
@Around("PointCuts.anyCustomPublicMethod()")
アドバイスに次のようなものを追加する方法、
debug.equals(TRUE)
Spring Expression Language を使用するように誰かに言われましたが、その方法がわかりません。
spring - 名前が同じで引数が異なる 2 つのメソッドの 2 つのポイントカット
へい。
永続化レイヤーのロギング用に @Aspect を作成しています。
最初に、経験豊富な開発者にエラーを表示する可能性のあるコード ;)
そしてここにアスペクト:
ポイントカット (およびそのメソッド) が 1 つしかない場合は機能しますが、2 つ目を追加すると、次の例外が発生します。
ポイントカットの順序を変更しました。常に 2 番目です。これを解決する方法についてのアイデアはありますか?
更新
質問を投稿したら、アイデアがありました。ポイントカットを次のように変更しました。
例外はなくなりましたが、まだ小さな問題があります (解決するのははるかに簡単だと思います): ArrayList は Serializable を実装しているため、少なくとも ArrayList を使用する私のテスト ケースでは、両方のポイントカットが実行されます。
私はそれを調べて、見つけたものを投稿しますが、助けも大歓迎です;)
更新 2
kriegaex が指摘したコピペエラーを修正。ありがとう!
メソッド logSave(..) の戻り値の型は Object です。
アップデート 3
コードを 1 つのポイントカットと 1 つのメソッドだけを使用するように変更し、kriegaex が提案したように instanceof で確認しました。
なぜ他の方法でうまくいかなかったのか、今でも疑問に思っています。
aop - 別のAspectJアスペクトでproceed()をインターセプトする方法は?
次のような状況がありLoggingAspect
ます。メインアプリケーションの特定のメソッド実行に一致するいくつかのポイントカットがあります。対応するアドバイス機関は基本的にすべて同じように見え、多くのコードの重複を引き起こします。
ただし、いくつかのバリエーションがあります。ポイントカットとアドバイスには、ログにも出力されるパラメータが含まれているarg
場合があります。this
次のように、他の多くの呼び出しをラップしていないマイナーな呼び出しである場合、「完了」メッセージが出力されないことがあります。
いつものことは、私が手動でロガーに伝えることです
proceed()
最初のメッセージが出力された後、つまり呼び出される直前にインデントレベルを上げるには、proceed()
最終メッセージが印刷される前(印刷されている場合)、つまり戻った直後にインデントレベルを下げる。
私の考えは、インデントレベルを自動的に調整するために、proceed()
呼び出しをインターセプトするポイントカットを使用してメタアスペクト(またはヘルパーアスペクトと呼びます)を記述したいと考えています。LoggingAspect
しかし、ポイントカットマッチングはないようproceed()
です。ロギングの面ですべてに一致するポイントカットでさえも試しcall(SomeMethodInMyMainApp)
ましたが、ポイントカットは必要のないものに一致しますが、続行することはありません。
誰かが私がこれを行う方法を知っているなら、私はヒントまたはコードスニペットをいただければ幸いです。
これを行う間接的な方法は、アドバイス自体ではなく、次のような追加のポイントカットを作成することによって、アドバイスによってアドバイスされたメソッド呼び出し(または実行)をインターセプトすることです。
catchAll()
ただし、ロギングの側面で何かを変更するたびに余分なポイントカットを更新することを覚えておく必要がないので、別の方法をお勧めします。
constructor - 特定の注釈を持つクラスのすべてのコンストラクターを選択するアスペクトポイントカットを定義する方法は?
注釈は次のとおりです。
注釈付きクラスの 1 つを次に示します。
2 番目の注釈付きクラスを次に示します。
ClassA および ClassB のコンストラクターに正しく一致するが、 で注釈が付けられていない他のクラスの他のコンストラクターには一致しない、aspectj ポイントカットを探していますMyAnnotation
。
java - カットがスーパークラスにあるときにポイントカットを2回ヒットしないようにするにはどうすればよいですか?派生クラスはオーバーライドしますか?
これに簡潔なタイトルを付けるのは難しいです。
とにかく、親クラスがあると想像してください:
getDimensions メソッドをオーバーライドする派生クラスがあります。
ポイントカットをオンにしてアスペクトを作成すると、が呼び出されShape.getDimensions
たときにポイントカットが 2 回ヒットします。Circle.getDimensions
Circle.getDimensions
super.getDimensions
ポイントカットは次のようになります。@Pointcut("execution(* Shape.getDimensions(..))")
宣言する型の名前を確認するためのアドバイス内にハックを追加しました ( を使用JoinPoint.getSignature().getDeclaringType().getName()
)。これを行うためのより良い方法があるに違いないと思います。
ある?
フォーメーションがあまり良くない場合は申し訳ありません。ここで初めて質問します(通常、すでに答えを見つけることができます)。
spring - AspectJ式'@within'は、パブリックメンバーを持たない具象クラスには影響しません。
これが私のサンプルクラスです:
アスペクトの定義:
DefaultAgentのインスタンスがプロキシされていないことがわかりました。
以下のように行を試しました:
'DefaultAgent $$ EnhancerByCGLIB $$ ae10cb14'のようなものを見つけることができると提案されましたが、それでも'DefaultAgent'です。
次に、クラス'DefaultAgent'に1つのパブリックメソッドを追加すると機能することがわかりました。
さらに掘り下げて、根本的な原因はアスペクトjウィーバーにあることがわかりました:
org.aspectj.weaver.patterns.WithinAnnotationPointcut.matchInternal(Shadow)
それはaspectjウィーバーのバグですか?実際のビジネスには多くの具体的なサブクラスがあり、パターン「テンプレート」の標準実装であるため、どうすれば解決できますか。
aspectj - AspectJ を使用して返されたオブジェクトの属性を変更する方法は?
単体テストで使用する新しい一時的な (永続化されていない) オブジェクトを返す (Spring Roo DataOnDemand から) 次のようなクラスがあります。これは、Spring Roo の ITD からプッシュインした後のコードです。
私がしなければならないことは、返されたオブジェクト参照に対して追加の呼び出しを行い、Spring Roo の自動生成メソッドが処理していない追加のフィールドを設定することです。したがって、上記のコードを変更する (または Roo の ITD からプッシュする) ことなく、次の呼び出しを 1 つ追加します。
これを行うために、適切なポイントカットを持ち、特定のメソッドをアドバイスする新しいアスペクトを宣言しました。
現在、Eclipse によると、ポイントカットは適切に記述されており、適切な方法をアドバイスしています。ただし、 name 属性が必要であるが設定されていないため、オブジェクトを永続化する統合テストがまだ失敗しているため、発生していないようです。Manning の AspectJ in Action (セクション 4.3.2) によると、after アドバイスは戻り値を変更できるはずです。しかし、代わりに around() アドバイスを行う必要があるのではないでしょうか?
java - メソッドレベルの注釈パラメーターを気にせずにポイントカットに一致するAspectj
Aspectj に関する問題で困惑しました。私がやろうとしているのは、メソッドレベルのアノテーションでアノテーションが付けられた呼び出しに対して「after() スロー」マッチを行うことです。
私が使用する場合
機能しますが、注釈にいくつかのパラメーターを追加した場合、それらは一致しません。
ポイントカットから何が欠けていますか??
明確にするために、両方の例を一致させたいと思いますが、注釈のパラメーターも気にしません。
AspectJ 1.6 のバージョン