AspectJ coupe transverse (pointcut) sur le constructeur de l'objet
J'ai besoin d'injecter quelques méthodes pour tous les initialisé objet à l'aide d'AspectJ.
Je pensais que l'utilisation de ce :
pointcut vistaInjection(Object o)
: initialization(java.lang.Object.new() )
&& target(o)
&& !within(objectAspect);
before(Object o): methodInjection(o){System.err.println("INIT");}
de coupe transverse (pointcut) de l'initialisation de l'objet, afin que je puisse injecter ces méthodes directement dans l'objet qui fait partie de chaque autre objet.
Toutefois, il ne fonctionne pas. Avez-vous une idée pourquoi? Ou ce qui peut être une autre façon de faire 100% sûr que tout le initialisé objet sera coupe transverse (pointcut)? *.nouveau ne fonctionne pas pour des choses telles Chaîne de caractères, les Listes et les autres.
Merci!
Est-il une erreur ? Pourriez-vous être plus précis à propos de la mauvaise fonction ?
non il n'y a pas d'erreur. juste la création d'un Objet ne déclenche pas des conseils.. Désolé, je ne comprends pas, qu'est-ce que "mal"? Je viens de prendre conscience, que la création d'autres objets ne pas initialiser le constructeur de l'Objet à cet effet, il serait inutile de toute façon. J'ai besoin de trouver d'autres façon de coupe transverse (pointcut) toutes les créations objet.
non il n'y a pas d'erreur. juste la création d'un Objet ne déclenche pas des conseils.. Désolé, je ne comprends pas, qu'est-ce que "mal"? Je viens de prendre conscience, que la création d'autres objets ne pas initialiser le constructeur de l'Objet à cet effet, il serait inutile de toute façon. J'ai besoin de trouver d'autres façon de coupe transverse (pointcut) toutes les créations objet.
OriginalL'auteur Marosh | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
Utilisateur selig est vrai: Vous ne voulez probablement pas à intercepter tous objet créations, surtout pas ceux du JDK/JRE classes. Mais pour ce que ça vaut la peine, voici une explication de ce qui fonctionne et comment et ce n'est pas:
Un peu de pilote d'application:
Un aspect avec différents types de constructeur liées pointcuts/conseils:
Le tissu conducteur de l'application de sortie:
Explication:
Il existe différents types de tissage dans AspectJ:
Maintenant ce que vous pouvez facilement le faire est d'intercepter appels de JDK/JRE constructeurs à partir de votre propre code oder tissé à la 3ème partie du code, comme vous pouvez le voir dans le journal de sortie de la ligne en disant
call(java.lang.String())
. Vous ne pouvez pas intercepter les appels internes, de JRE classe de JRE classe.Après avoir dit tout cela, je me demande vraiment ce genre de chose horrible que vous voulez faire. Je veux dire, vous l'expliquer, et il ressemble à une énorme erreur de conception. Ou vous voulez ré-inventer la roue, et écrire une sorte de profiler ou un débogueur qui existe déjà. Qu'attendez-vous de les intercepter chaque création d'un objet? Il serait considérablement ralentir votre application, augmentent considérablement la consommation de mémoire et de créer encore plus d'objets, si seulement les chaînes que vous êtes connecté. Veuillez reconsidérer et essayez de penser à ce que vous voulez vraiment faire. Alors, peut-être, nous pouvons vous suggérer une façon intelligente de la réalisation de votre objectif.
Ensuite, l'utilisateur peut appeler e.g o.supprimer l'autorisation("methodName") et de l'o.methodName, une exception est levée. Il y a alors deux options de je considère. La première est de créer pointucts dans l'exécution, ce que j'ai trouvé comme pas possible, la seconde est de faire l'annulation par les Annotations(n'ont pas encore entièrement explorés) et la troisième est la simple force brute réalisée par l'interception de tous les appels de méthodes dans l'application et en les comparant à une "dé-méthodes autorisées". Le dernier est stupide et de faire tout cela, impossible de la pensée, car il serait de ralentir le système comme vous l'avez dit énormément.
pouvez-vous jeter un oeil à une question similaire, stackoverflow.com/questions/53270967/...
OriginalL'auteur kriegaex
Avez-vous essayé
c'est à dire l'appel de
.new()
sur quoi que ce soit et permettant pas de et certains arguments.Remarque - vous ne voulez probablement pas à ramasser tous objet créations.. ce que prévoyez-vous faire avec eux!
OriginalL'auteur selig