Pointcut für annotierte Methoden oder Methoden in annotierten Klassen

8

Ich brauche einen Punktschnitt für Methoden in Klassen, die mit @X kommentiert sind oder Methoden, die mit @X kommentiert sind.

Ich brauche auch das Annotationsobjekt . Wenn sowohl die Klasse als auch die Methode mit Anmerkungen versehen sind, bevorzuge ich es, die Annotation der Methode als Argument zu erhalten.

Ich habe Folgendes versucht, was eine Warnung "inkonsistente Bindung" erzeugt. (Warum nicht einfach null setzen?)

%Vor%

Im Folgenden wird eine "mehrdeutige Bindung von Parametern x über '||' in pointcut "Warnung. (Was meiner Meinung nach nicht unbedingt Sinn macht: Warum binden Sie nicht die erste Kurzbewertung?)

%Vor%

Wenn Sie den vorherigen Versuch in zwei Teile aufteilen, führt dies natürlich zu zwei Methodenaufrufen, wenn Klassen- und Methodenanmerkungen vorhanden sind.

Ich weiß, dass ich die Methode und Klasse mit Reflektion und meine gewünschte Annotation mit einem Punktschnitt wie folgt erhalten könnte:

%Vor%

Aber ich möchte lieber nicht.

Gibt es ein "One Pointcut, eine Methode, ein Annotationsargument", eine Lösung für meine Anforderung, die keine Reflektion erfordert?

    
Traubenfuchs 23.03.2016, 10:18
quelle

1 Antwort

11

Nicht ganz, aber fast. Sie benötigen zwei Pointcuts, zwei Ratschläge, aber Sie können die Arbeit an eine einzige Methode delegieren. So würde es aussehen:

%Vor%

Beachten Sie, dass ich neben dem Aufteilen der Punktcodes @annotation() und @within() den resultierenden Punktzügen Einschränkungen hinzugefügt habe, damit sie nicht zu breit sind. Ich nehme an, dass Sie Methodenausführung Join-Punkte wollen, also fügte ich die benötigten Pointcut-Ausdrücke hinzu, die diese auf die Methodenausführung beschränken würden. Sie stimmen überein

  1. Ausführung einer beliebigen Methode, die mit @X mit einem beliebigen Rückgabetyp in einer beliebigen Klasse in einem Paket versehen ist für den ersten Hinweis
  2. Ausführung einer beliebigen Methode mit einem beliebigen Rückgabetyp in einer Klasse, die mit @X für den zweiten Kommentar versehen ist.

Die weitere Einschränkung von @within(X) und @annotation(X) ist praktisch, weil @within(X) für sich selbst

entspricht
  

jeder Join-Punkt, an dem der zugehörige Code in einem Typ mit definiert ist   eine Anmerkung vom Typ X

was method-execution , Methodenaufruf , Konstruktorausführung , Konstruktoraufruf einschließt, Vorinitialisierung , statische Initialisierung , Initialisierung , Feldsatz , Feld get , Ausnahmehandler , Sperre geben Join-Punkte ein (nicht alle Join-Punkte sind jedoch für um Ratschläge gültig). In ähnlicher Weise würde @annotation(X) für sich selbst

bedeuten
  

Jeder Join-Punkt, an dem der Betreff eine Anmerkung vom Typ X

hat

, was abhängig vom Zieltyp Ihrer Anmerkung auch die meisten der zuvor erwähnten Join-Punkte bedeuten könnte.

    
Nándor Előd Fekete 24.03.2016, 05:34
quelle

Tags und Links