Sind statische Initialisierer garantiert für AspectJ Aspekte genannt werden?
-
19-09-2019 - |
Frage
Dies ist meine erste Frage so bitte sanft sein. :-) Ich weiß AspectJ pointcuts auf statische Initialisierer von Java erstellen können Klassen . Aber die Frage ist, ob eine statische Initialisierer in ein Aspekt, wie weiter unten wird garantiert genau einmal aufgerufen werden:
@Aspect
public class MyAspect {
private static Map configuration;
static {
// Some initialization stuff
configuration = Config.getConfiguration();
}
... use the "configuration" map in pointcuts and advices
}
Mit anderen Worten, ist ein Aspekt wie eine Java-Klasse geladen geladen wird? Ist dies über einen Classloader getan? Ich vermute ja - und es scheint zu funktionieren -. Aber ich bin auf der Suche nach einer Garantie in diese Richtung
Lösung
arbeitet AspectJ Bytecode Modifikation verwendet wird. Diese Änderung bei der Kompilierung passieren verwelken kann ( „Kompilierung-Weben“ oder CTW) oder während der Ladezeit ( „Load-Zeit Weben“ oder LTW).
Wenn Sie sicher sein wollen, dann empfehle ich Ihnen den aspectj Compiler verwenden CTW auf Ihrem Beispiel auszuführen, und dann passieren die resultierenden Klassendateien durch das javap
Werkzeug (oder so ähnlich), um zu sehen, was es tatsächlich erzeugt hat. Das sollte Ihnen die Sicherheit geben, dass es (oder nicht) zu tun, was Sie denken, es tut.