Question

Quelqu'un où je travaille remarqués (en stacktrace) que lors de l'exécution de la machine virtuelle avec -javaagent: printemps-instrumentation.jar mes classes JAXB annotée ont d'étranges nouvelles méthodes que nous les avons pas écrit: par exemple SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get

Est-ce que cela signifie que JAXB utilise l'instrumentation bytecode lorsqu'il est disponible? Où puis-je en savoir plus sur cette fonctionnalité?

Merci, Yuval

Était-ce utile?

La solution

Juste un ajout au poste de skaffman:

Ce que vous voyez (SomeJaxbAnnotatedClass $ JaxbAccessor ...) est une classe interne, qui est généré dynamiquement par l'implémentation de référence JAXB. Pour éviter les frais généraux de réflexion à l'exécution, bytecode pour les mises en œuvre concrètes du com.sun.xml.bind.v2.runtime.reflect.Accessor de classe sont générés et injecté dans le chargeur de classe actuelle en invoquant ClassLoader.defineClass (String, byte [], int, int), après l'utilisation de la réflexion pour contourner le modificateur d'accès protégé du procédé defineClass.

Ainsi, la mise en œuvre de référence JAXB n'instrumentant bytecode dans le sens où il est la modification des classes existantes, mais génère de nouvelles classes pour les performances d'exécution optimisé.

Autres conseils

Lorsque la JaxbContext démarre, il effectue une grande quantité d'opérations de réflexion, d'effectuer une pré-cache toutes les choses qu'il faudra par la suite. Ceci est fait pour des raisons de performance. Je ne sais pas ce qu'il fait exactement, mais je pense qu'elle doit effectuer une sorte de logique de génération de classe d'exécution, puisque ce sera plus rapide lors de l'exécution que la réflexion brute.

Il est intéressant, vous pouvez désactiver ce comportement en définissant une propriété du système non documenté, ce qui améliore le démarrage du contexte, au détriment de la performance d'exécution.

modifier Je tiens à souligner que c'est ce que la mise en œuvre de référence Sun JAXB fait sous les couvertures, il ne fait pas partie de la spécification JAXB. D'autres mises en œuvre sont libres de faire ce qu'ils choisissent.

Aux dernières nouvelles, JAXB utilise la réflexion pour générer des classes basées sur le XML que vous fournissez (bien que je ne l'ai pas utilisé dans un certain temps, ils peuvent avoir changé leur méthodologie).

Je sais que JiBX , d'autre part, utilise BCEL pour effectuer des opérations de bytecode. Voici un article à ce sujet: http://www.ibm.com/ developerworks / java / bibliothèque / j-cwt09065 / .

Comme mentionné par skaffman vous pouvez désactiver la génération de toutes les classes internes en définissant la propriété du système: com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot = true

Bien sûr, il est pas documenté, mais il n'a pas changé depuis des années.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top