سؤال

شخص ما أعمل لاحظه (في StackTrace) أنه عند تشغيل JVM مع -javaagent: spring -instrumentation.jar ، فإن فصول Jaxb المشروح لها طرق جديدة غريبة فيها لم نكتبها: على سبيل المثال

هل هذا يعني أن Jaxb يستخدم أدوات Bytecode عندما يكون متاحًا؟ أين يمكنني قراءة المزيد عن هذه الوظيفة؟

شكرا ، يوفال

هل كانت مفيدة؟

المحلول

مجرد إضافة إلى منشور Skaffman:

ما تراه (SomeJaxBannotatedClass $ Jaxbaccessor ...) هو فئة داخلية ، والتي يتم إنشاؤها ديناميكيًا بواسطة تطبيق مرجع JaxB. لمنع انعكاس النفقات العامة في وقت التشغيل ، Bytecode للتطبيقات الملموسة للفئة com.sun.xml.bind.v2.runtime.reflect.Accessor يتم إنشاؤها وحقنها في محمل classload الحالي عن طريق استدعاء classloader.defineclass (السلسلة ، البايت [] ، int ، int) ، بعد استخدام الانعكاس للتحايل على معدل الوصول المحمي لطريقة defereclass.

لذلك ، فإن تطبيق مرجع JaxB ليس صياغة بقلق ، بمعنى أنه يعدل الفئات الحالية ، ولكنه يولد فئات جديدة لأداء وقت التشغيل المحسّن.

نصائح أخرى

عندما JaxbContext يبدأ الأمر ، فهو يؤدي كمية كبيرة من عمليات الانعكاس ، لتخزين كل الأشياء التي ستحتاجها لاحقًا. يتم ذلك لأسباب الأداء. لست متأكدًا من ما يفعله بالضبط ، لكنني أتوقع أن يؤدي ذلك نوعًا من منطق توليد فئة وقت التشغيل ، لأن ذلك سيكون أسرع في وقت التشغيل من الانعكاس الخام.

ومن المثير للاهتمام ، أنه يمكنك إيقاف تشغيل هذا السلوك عن طريق تعيين خاصية نظام غير موثقة ، مما يحسن بدء تشغيل السياق ، على حساب أداء وقت التشغيل.

تعديل: يجب أن أؤكد أن هذا هو ما يقوم به تطبيق Sun Jaxb Reference تحت الأغطية ، فهو ليس جزءًا من مواصفات JaxB. التطبيقات الأخرى حرة في القيام بكل ما يختارونه.

أخيرًا ، راجعت ، يستخدم Jaxb انعكاسًا لإنشاء فصول استنادًا إلى XML التي تقدمها (على الرغم من أنني لم أستخدمها في بعض الوقت ، لذلك ربما تكون قد غيرت منهجيتها).

وأنا أعلم ذلك Jibx, ، من ناحية أخرى ، يستخدم بسيل لأداء أجهزة Bytecode. إليك مقال حول ذلك: 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