Использует ли JAXB инструментарий байт-кода? - PullRequest
8 голосов
/ 25 января 2010

Кто-то, где я работаю, заметил (в stacktrace), что при запуске jvm с -javaagent: spring-instrumentation.jar в моих аннотированных классах JAXB есть странные новые методы, которые мы не писали: например, SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get

Означает ли это, что jaxb использует инструментарий байт-кода, когда он доступен? Где я могу прочитать больше об этой функции?

Спасибо, Юваль

Ответы [ 4 ]

12 голосов
/ 25 января 2010

Просто дополнение к сообщению скаффмана:

То, что вы видите (SomeJaxbAnnotatedClass $ JaxbAccessor ...), является внутренним классом, который динамически генерируется эталонной реализацией JAXB. Чтобы предотвратить издержки отражения во время выполнения, байт-код для конкретных реализаций класса com.sun.xml.bind.v2.runtime.reflect.Accessor создается и внедряется в текущий загрузчик классов, вызывая ClassLoader.defineClass (String, byte [], int, int), после использования отражения для обхода защищенного модификатор доступа для метода defineClass.

Таким образом, эталонная реализация JAXB не инструментирует байт-код в том смысле, что она модифицирует существующие классы, но генерирует новые классы для оптимизированной производительности во время выполнения.

8 голосов
/ 25 января 2010

Когда JaxbContext запускается, он выполняет большое количество операций отражения, чтобы предварительно кэшировать весь материал, который ему понадобится позже. Это сделано из соображений производительности. Я не уверен, что именно он делает, но я ожидаю, что он будет выполнять какую-то логику генерации классов во время выполнения, так как это будет быстрее во время выполнения, чем необработанное отражение.

Интересно, что вы можете отключить это поведение, установив недокументированное системное свойство, которое улучшает запуск контекста за счет производительности во время выполнения.

edit: Я должен подчеркнуть, что это то, что эталонная реализация Sun JAXB делает под прикрытием, это не часть спецификации JAXB. Другие реализации могут делать все, что пожелают.

1 голос
/ 25 января 2010

В последний раз, когда я проверял, JAXB использует отражение для генерации классов на основе предоставленного вами XML (хотя я не использовал его некоторое время, поэтому они могли изменить свою методологию).

Я знаю, что JiBX , с другой стороны, использует BCEL для выполнения инструментирования байт-кода. Вот статья об этом: http://www.ibm.com/developerworks/java/library/j-cwt09065/.

0 голосов
/ 09 ноября 2017

Как упомянуто skaffman, вы можете отключить генерацию всех этих внутренних классов, установив системное свойство: com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot = true

Конечно, это не задокументировано, но оно не менялось годами.

...