Frage

Jemand, bei dem ich arbeite (in Stacktrace), dass beim Ausführen der JVM mit -Javaagent: Spring -Instrumentation

Bedeutet dies, dass JAXB Bytecode -Instrumentierung verwendet, wenn sie verfügbar ist? Wo kann ich mehr über diese Funktionalität lesen?

Danke, Yuval

War es hilfreich?

Lösung

Nur eine Ergänzung zu Skaffman's Post:

Was Sie sehen (irgendein JaxbannotatedClass $ jaxbaccessor ...) ist eine innere Klasse, die dynamisch durch die JAXB -Referenzimplementierung generiert wird. Um die Reflexionsaufwand zur Laufzeit zu verhindern, Bytecode für die konkreten Implementierungen der Klasse com.sun.xml.bind.v2.runtime.reflect.Accessor werden generiert und in den aktuellen Klassenloader injiziert, indem Classloader.DefineClass (String, Byte [], int, int, int) nach der Reflexion zum Umgehung des geschützten Zugriffsmodifikators der definitiven Methode verwendet wird.

Die JAXB -Referenzimplementierung ist also nicht in dem Sinne instrumentiert, dass sie vorhandene Klassen ändert, sondern neue Klassen für eine optimierte Laufzeitleistung generiert.

Andere Tipps

Wenn der JaxbContext Starts führt eine große Menge an Reflexionsoperationen durch, um alle Dinge vorzubeugen, die es später benötigen wird. Dies geschieht aus Leistungsgründen. Ich bin mir nicht sicher, was es genau tut, aber ich würde erwarten, dass es eine Art Runtime -Logik für die Generierung von Laufzeiten durchführt, da dies zur Laufzeit schneller sein wird als bei der rohen Reflexion.

Interessanterweise können Sie dieses Verhalten ausschalten, indem Sie eine nicht dokumentierte Systemeigenschaft, die das Start des Kontextes verbessert, auf Kosten der Laufzeitleistung verbessert.

bearbeiten: Ich sollte betonen, dass dies die Sun Jaxb -Referenzimplementierung unter den Covers ist, es ist nicht Teil der JAXB -Spezifikation. Andere Implementierungen können frei tun, was sie wählen.

Zuletzt habe ich überprüft, dass JAXB Reflexion anhand der von Ihnen bereitgestellten XML -Klassen generiert hat (obwohl ich ihn seit einiger Zeit nicht mehr verwendet habe, haben sie möglicherweise ihre Methodik geändert).

ich weiß das Jibx, Andererseits verwendet, verwendet Bcel Bytecode -Instrumentierung durchführen. Hier ist ein Artikel darüber: http://www.ibm.com/developerworks/java/library/j-cwt09065/.

Wie von Skaffman erwähnt, können Sie die Erzeugung all dieser inneren Klassen deaktivieren, indem Sie die Systemeigenschaft festlegen: com.sun.xml.internal.bind.v2.runtime.jaxbContextImpl.fastboot = true

Natürlich ist es nicht dokumentiert, aber es hat sich seit Jahren nicht mehr verändert.

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