هل يستخدم Jaxb أجهزة Bytecode؟
-
22-09-2019 - |
سؤال
شخص ما أعمل لاحظه (في 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
بالطبع لم يتم توثيقه ، لكنه لم يتغير لسنوات.