Aspectj Pointcut zum Abgleichen von öffentlichen Methodenaufrufen für annotierte Felder

8

Ich möchte einen Pointcut schreiben, der die Ausführung öffentlicher Methoden in einem mit Anmerkungen versehenen Feld vergleicht. Dies scheint jedoch nicht zu funktionieren. Das get (@Important) funktioniert wie von Ihnen erwartet, aber es wird natürlich alle Zugriffe auf das Feld zugeordnet. Ich möchte dies auf die Ausführung öffentlicher Methoden beschränken.

Ist das überhaupt möglich? Ich bekomme keinen Kompilierfehler, aber auf der anderen Seite scheint es nicht zu funktionieren.

%Vor%

Works:

%Vor%

Funktioniert nicht:

%Vor%
JustOneMoreQuestion 28.02.2013, 15:02
quelle

2 Antworten

2

Für das, was Sie wollen, gibt es keine Out-of-the-Box-Lösung von AspectJ, denn wenn Sie Methodenausführungen von Objekten abfangen, gibt es keine Verbindung zu annotierten Feldern, die auf diese Objekte verweisen könnten. Es wäre einfacher, Methodenausführungen annotierter Klassen oder annotierter Methoden abzufangen, aber das ist nicht das, was Sie tun möchten.

Hier ist ein kleines Codebeispiel, das Ihnen einen Workaround, aber auch seine Einschränkungen zeigt:

%Vor% %Vor% %Vor% %Vor%

Wie Sie sehen können, enthält mein Aspekt eine Reihe von "wichtigen Objekten". Genauer gesagt ist es ein Map , in dem die Schlüssel die "wichtigen Objekte" sind und die Werte Sätze von Referrern sind. Dies ist notwendig, da theoretisch mehrere Referrer (z. B. Visitors -Objekte) auf identische "wichtige Objekte" (z. B. eine bestimmte Counter ) zeigen können. In einer früheren Version meines Beispielcodes, als ich gerade die "wichtigen Objekte" in einem einfachen Set aufzeichnete, hatte ich die Wahl, nie zuvor "wichtige Objekte" aus dem Set zu entfernen, auch wenn sie nicht mehr referenziert waren oder sie immer wieder entfernten wenn ein zweiter Referrer noch auf ein "wichtiges Objekt" zeigt. Der Map-Ansatz ermöglicht es mir, mehrere Referrer pro "wichtiges Objekt" zu erfassen.

Wenn Sie Visitors.main(String[]) ausführen, sehen Sie die folgende Ausgabe (bitte entfernen Sie den Kommentar before ... : unimportantSetter ... , wenn Sie noch mehr Protokollausgaben sehen möchten):

%Vor%

Bitte vergleichen Sie den Code in main sorgfältig mit der Protokollausgabe, um zu sehen, welche regulären und speziellen Fälle ich getestet habe.

Wie gesagt, der Ansatz hat seine Grenzen:

  • Ich habe nicht getestet, was passieren wird, wenn wichtige Felder primitive Typen wie int oder String s haben, die theoretisch mehrfach als "wichtige Objekte" auftreten können, weil mehrere nicht verwandte wichtige Elemente gleiche Objekte erzeugen. Ich habe auch nicht getestet, was passiert mit Auto (un) Boxen, bitte versuchen Sie es selbst.
  • Der Aspektcode ist etwas komplex und wahrscheinlich nicht blitzschnell.
  • Ich kann nicht garantieren, dass es keine anderen Probleme gibt, an die ich noch nicht gedacht habe.

Wenn Sie jedoch die Randbedingungen und Anwendungsfälle beherrschen, können Sie eine fundierte Entscheidung treffen und den Code wie er ist oder eine Variante davon verwenden, um das zu erreichen, was Sie brauchen. Der Code hat wahrscheinlich Potenzial für Verbesserungen, ich war nur neugierig und wollte einen Proof of Concept hacken.

    
kriegaex 17.03.2013, 17:50
quelle
0

Sie möchten den withinCode pointcut wie folgt verwenden:

%Vor%

Sehen Sie sich den AspectJ-Programmierleitfaden an.

    
Andrew Eisenberg 01.03.2013 05:04
quelle

Tags und Links