Вопрос

Кто -то, где я работал, заметил (в Stacktrace), что при запуске JVM с -Javaagent: Spring -Instrumentation.jar у меня в аннотированных классах Jaxb есть странные новые методы, которые мы не писали: например, QueeJaxBannotatedClass $ jaxbaccessorm_getfields_setfields_java_set.get.

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top