Pregunta

Alguien donde trabajo di cuenta (en StackTrace) que cuando se ejecuta la JVM con -javaagent: primavera-instrumentation.jar mis clases JAXB anotada tienen nuevos métodos extraños en los que no hemos escrito: por ejemplo, SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get

¿Quiere decir esto que los usos JAXB código de bytes de instrumentación cuando está disponible? ¿Dónde puedo leer más sobre esta funcionalidad?

Gracias, Yuval

¿Fue útil?

Solución

Sólo un además del puesto de skaffman:

Lo que se ve (SomeJaxbAnnotatedClass $ JaxbAccessor ...) es una clase interna, que se genera dinámicamente mediante la implementación de referencia JAXB. Para evitar sobrecarga de reflexión en tiempo de ejecución, el código de bytes para las implementaciones concretas de la com.sun.xml.bind.v2.runtime.reflect.Accessor clase se generan y se inyecta en el cargador de clase actual invocando ClassLoader.defineClass (String, byte [], int, int), después de usar la reflexión para eludir el modificador de acceso protegido del método defineClass.

Por lo tanto, la implementación de referencia JAXB no está instrumentando código de bytes en el sentido de que está modificando las clases existentes, sino que genera nuevas clases para un rendimiento optimizado en tiempo de ejecución.

Otros consejos

Cuando el JaxbContext se pone en marcha, lleva a cabo una gran cantidad de operaciones de reflexión, para pre-caché de todas las cosas que necesitará más adelante. Esto se hace por razones de rendimiento. No estoy seguro de lo que hace exactamente, pero yo esperaría que realizar algún tipo de tiempo de ejecución de la lógica de generación de la clase, ya que será más rápido que en tiempo de ejecución raw reflexión.

Curiosamente, se puede convertir este comportamiento fuera estableciendo una propiedad no documentada del sistema, lo que mejora el arranque del contexto, a expensas del rendimiento en tiempo de ejecución.

editar Debo enfatizar que esto es lo que hace la implementación de referencia de Sun JAXB bajo las sábanas, no es parte de la especificación JAXB. Otras implementaciones son libres de hacer lo que quieran.

Que yo sepa, JAXB utiliza la reflexión para generar clases basado en el XML que proporcione (aunque yo no lo he utilizado en algún momento, por lo que pueden haber cambiado su metodología).

Sé que JiBX , por el contrario, usos BCEL para llevar a cabo la instrumentación de código de bytes. Aquí está un artículo sobre eso: http://www.ibm.com/ developerworks / java / library / j-cwt09065 / .

Como se ha mencionado por skaffman puede desactivar la generación de todas esas clases internas mediante el establecimiento de la propiedad del sistema: com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot = true

Por supuesto que no documentado, pero no ha cambiado desde hace años.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top