Les temps peuvent venir? La programmation orientée aspect, qu'est-ce que le langage Aspect J a été résumée et décrite sur les coupes de points, mais il y a eu plus de coupes de points que ce à quoi je m'attendais. C'est long et difficile à comprendre, et il semble qu'il y ait des coupures de points implémentées dans AspectJ, j'ai donc décidé de le diviser. Veuillez noter qu'il était divisé en dogmatisme et préjugés.
L'initialisation statique est fournie pour les coupes de points liées aux initialiseurs statiques Représente le «moment» auquel un initialiseur statique est appelé et exécuté qui prend un modèle de type comme argument et initialise le champ statique de la classe.
Sample.java
//Écrivez le nom de la classe directement ou utilisez des caractères génériques
staticinitialization(Session+)
Également appelé initialiseur statique ou initialiseur de classe Une méthode spéciale déclarée pour chaque classe pour initialiser la valeur d'un champ statique
staticInitializer.java
static {
//Code qui initialise la valeur d'un champ statique
}
Les coupes ponctuelles peuvent être combinées à l'aide d'opérateurs Cependant, soyez prudent, car l'appel semble encapsuler l'exécution comme indiqué dans la figure ci-dessus, alors appelez && exectuion et Même si cela ressemble au code ci-dessous, c'est en fait différent
Sample.java
class Sample {
Sample() {
Main.init()
}
}
class Main {
static void init() {
hoge();
}
static int length() {
return hoge
}
}
Comme le montre la figure ci-dessous, l'exécution spécifie la partie bleu clair (la partie à l'extérieur du point de jointure) et l'appel est dans la partie verte. && la condition ne devient jamais vraie
Mais que faire si vous souhaitez créer une telle condition? En plus de sélectionner un type spécifique de point de jonction pour la solution, nous proposons également une coupe de point primitive qui sélectionne le point de jonction en fonction de l'emplacement dans le programme.
: black_small_square: ** within (type de motif) ** Sélectionnez tous les points de jointure qui se produisent dans les déclarations de classe ou d'interface qui correspondent au modèle de type Tout type de point de jonction
: black_small_square: ** withincode (modèle de méthode) ** ou ** withincode (modèle de constructeur) ** Sélectionnez tous les points de jointure qui se produisent dans le corps de la méthode ou du constructeur qui correspondent au modèle d'argument Tout type de point de jonction
En utilisant ce qui précède, vous pouvez spécifier qu'il appartient à une classe ou une méthode spécifique.
Il y a deux coupes ponctuelles liées au flux commercial, ** cflow ** et ** cflow ci-dessous **. Prenez un point coupé comme argument pour représenter le «temps»
Sample.java
cflow(call(void Main.init()))
:black_small_square:cflow Sélectionne tous les points de jointure qui se produisent entre le début et la fin du point de jointure P sélectionné par le point de coupe de l'argument. cflow sélectionne le point de jointure P sélectionné par le point de coupe de l'argument
:black_small_square:cflowbelow Presque identique à cflow, mais contrairement à cflow, le point de jointure P sélectionné par le point de coupe de l'argument n'est pas sélectionné
withincode
withincode.java
call(void Main.hogeB()) && withincode(void Main.init())
Puisque withincode est un point de jointure qui se produit dans le corps de la méthode qui correspond au modèle d'argument Dans ce cas, seul le point de jointure où la méthode appelée main.hogeA est appelée Il n'y a donc pas de correspondance pour l'appel (void Main.hogeB ())
cflow
cflow.java
call(void Main.hogeB()) && cflow(call(void Main.init()))
Puisque cflow sélectionne tous les points de jointure qui se produisent entre le début et la fin du point de jointure P sélectionné par le point de coupe de l'argument. Dans ce cas, le point de jointure où les méthodes main.hogeA et main.hogeB sont appelées Par conséquent, il y a quelque chose qui correspond à call (void Main.hogeB ()).
La coupure du point d'appel sélectionne le «quand» lorsque la méthode spécifiée dans le modèle de méthode est appelée comme point de jointure. Ce point de jointure n'est pas uniquement destiné aux méthodes, mais également aux appels de méthode qui apparaissent dans la définition d'aspect. Cela s'applique également aux coupures de points autres que l'appel.
Hello.java
impoort java.io.*;
aspect Tracer {
pointcut tracedMethods(): call(* PrintStream.println(..));
before(): tracedMethods() {
System.out.println("** method call");
}
}
public class Hello {
public static void say() {
System.out.println("Hello");
}
public static void main(String[] args) {
say();
}
}
L'écriture d'un programme comme celui ci-dessus entraînerait une boucle infinie
Pour éviter ce problème, il y a ** exécution des conseils ** dans le point de coupure lié aux conseils Représente le "moment" où le corps de tout conseil est exécuté sans prendre d'arguments
Sample.java
!cflow(adviceexecution())
//Sélectionnez tous les points de jointure sauf lors de l'exécution du corps de conseils
Il existe trois raccourcis liés aux informations de contexte d'exécution du programme: ** this **, ** target ** et ** args **.
:black_small_square:this Sélectionnez tous les points de jointure qui se produisent dans le corps d'une méthode ou d'un constructeur exécuté par une instance d'un type (y compris les sous-classes et les sous-interfaces) qui correspond à l'argument pointcut Tout type de point de jonction
:black_small_square:target Sélectionnez tous les appels de méthode et l'accès aux champs pour les instances de types (y compris les sous-classes et les sous-interfaces) qui correspondent aux arguments de coupe en tant que points de jointure. Tout type de point de jonction
:black_small_square:args Sélectionnez une méthode ou un appel de constructeur qui prend un argument du type qui correspond à l'argument pointcut comme point de jointure.
Sélectionnez un point de jointure lorsque la classe de l'objet pointé par cette variable correspond à l'argument pointcut
Sample.java
call(* *(..)) && this(Session)
//Ce qui précède sélectionne l'appel de n'importe quelle méthode à partir des méthodes de la classe Session ou de sa sous-classe comme point de jointure.
Sélectionnez un point de jointure lorsqu'il correspond au type de la classe de l'objet appelé ou auquel le champ accède et l'argument pointcut
Sample.java
class Session {}
class BookSession extends Session{}
Sample.java
call(* Session.*(..)) && target(BookSession)
//Ce qui précède n'est sélectionné comme point de jointure que lors de l'appel d'un objet BookSession parmi les méthodes déclarées dans la classe Session.
Session s = new BookSession(301);
s.doIt();
Sample.java
call(* *(..)) && args(BookSession, ..)
//Sélectionnez un appel de méthode comme point de jointure dont le premier argument est une instance de la classe BookSession
Notez que le pointcut args utilise également le type réel de l'objet argument lors de l'examen du type.
Recommended Posts