[JAVA] Liste des coupes ponctuelles pour réaliser des coupes ponctuelles plus fines

introduction

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.

Coupure ponctuelle qui n'a pas pu être résumée

** Coupure de point liée à l'initialiseur statique **

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+)

Qu'est-ce qu'un initialiseur statique?

É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
}

** Coupes de points liées à l'emplacement des points de jointure **

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

qiita8.PNG

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.

qiita9.PNG

** Coupure ponctuelle liée au flux d'affaires **

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é

** Différence entre within code et cflow **

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 ()).

qiita10.PNG

** Point coupé lié aux conseils **

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.

Problème d'appel récursif infini

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

qiita11.PNG

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

** Point cut pour récupérer des informations contextuelles **

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.

** Comment utiliser cette coupe à point **

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.

** Comment utiliser la coupe de point cible **

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();

** Comment utiliser la coupe de point args **

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.

** Point coupé à l'aide d'une expression booléenne **

** Coupe ponctuelle nommée **

référence

Recommended Posts

Liste des coupes ponctuelles pour réaliser des coupes ponctuelles plus fines
Une liste de rawValues pour UITextContentType.
Liste des destinations de téléchargement pour Oracle Java
Obtenir une liste d'informations MBean pour les applications Java
Conseils pour bien utiliser Canvas avec Xcode
Sortie d'une liste de paramètres cron pour tous les utilisateurs.
Liste des instructions Java fréquemment utilisées (pour les débutants et les débutants)
Liste des instructions MySQL pour les débutants en programmation * Mémo personnel
Liste des mémos débutants (Liste)
Micro-benchmark pour les nombres à virgule flottante à la puissance des entiers dans Ruby