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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top