سؤال

أنا أكتب رسالة الماجستير الخاصة بي، والتي تتناول AOP في .NET، من بين أمور أخرى، وأذكر عدم وجود دعم لاستبدال الفئات في وقت التحميل كعامل مهم في حقيقة أنه لا يوجد حاليًا أطر عمل .NET AOP التي أداء نسج ديناميكي حقيقي - ليس من دون فرض متطلبات توسيع الطبقات المنسوجة ContextBoundObject أو MarshalByRefObject أو كشف كل دلالاتهم على الواجهة.

ومع ذلك، يمكنك القيام بذلك باستخدام Java في JVM بفضل ClassFileTransformer:

  • أنت تمتد ClassFileTransformer.
  • قمت بالاشتراك في حدث تحميل الفصل الدراسي.
  • عند تحميل الفصل، تقوم بإعادة كتابة الفصل واستبداله.

كل هذا جيد جدًا، لكن مدير المشروع الخاص بي طلب مني، في اللحظة الأخيرة، أن أقدم له قائمة بالأطر (واللغات المرتبطة بها) التي تدعم/لا تدعم استبدال الفصل.ليس لدي وقت للبحث عن هذا الآن:لن أشعر بالارتياح بمجرد إجراء بحث سطحي وربما وضع معلومات خاطئة في أطروحتي.

لذلك أسألكم، يا مجتمع البرمجة القدير، هل يمكنك المساعدة؟بالطبع، أنا لا أطلب منكم البحث في هذا الأمر بأنفسكم.ببساطة، إذا كنت تعرف بالتأكيد أن إطار عمل معين يدعم/لا يدعم هذا، اتركه كإجابة.إذا لم تكن متأكدا من فضلك لا تنسى الإشارة إلى ذلك.

ًشكراً جزيلا!


يحرر:@ewernli

  • أنا أسأل عن (٢).
  • في C#، يمكنك بالفعل إصدار تعليمات برمجية في وقت التشغيل وإنشاء فئات جديدة ديناميكيًا، لكنها كذلك جديد الطبقات، فإنها لا تحل محل فئة موجودة.ما أود القيام به هو تحويل الفصل في وقت التحميل، كما يمكنك القيام به في Java باستخدام ملف ClassFileTransformer.
  • حول تعديل توقيع الطريقة:نعم انت على حق.كان يجب أن أذكر أنني في حالتي لا أرغب في تعديل واجهة الفصل، بل محتوى أساليبه.

إجابتك كانت مفيدة حقا.شكرًا لك :)

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

المحلول

هل تسأل عن (1) استبدال الفصل الحقيقي في وقت التشغيل، أو (2) تسهيلات لتحويل الفصل عند تحميله أو (3) اللغات التي تدعم التحميل الديناميكي للفئة؟

تدعم Java تحميل الفئة الديناميكية ClassLoader, ، التحول مع ClassFileTransformer, ، ولكن لا يوجد استبدال حقيقي للطبقة.

لست متأكدًا من لغة C#، ولكن أعتقد أنه يمكنك إصدار التعليمات البرمجية في وقت التشغيل وإنشاء فئة جديدة ديناميكيًا، حتى تتمكن من تحقيق (3) وربما (2).

يتم دعم استبدال الفئة الحقيقية في الغالب فقط بواسطة لغة ديناميكية, ، على سبيل المثال.Smalltalk، روبي، أعتقد بايثون وعدد قليل من الآخرين.وهذا يتطلب تحويل مثيلات الفئة لتتناسب مع الشكل الجديد.يقومون عادةً بتهيئة الحقول الجديدة إلى الصفر إذا تغير الفصل.

AFAIK، تقوم اللغات الديناميكية المنقولة إلى JVM بإجراء اختراق واسع النطاق لـ ClassLoader لدعم استبدال الفصل في وقت التشغيل.بالنسبة لـ JRuby، انظر أول طعم للاستدعاء الديناميكي للحصول على المزيد من المؤشرات حول كيفية القيام بذلك الآن، وما هي المشكلات وكيف يمكن أن يحدث ذلك في المستقبل invokedynamic قد تساعد.

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

كانت هناك بعض المحاولات لإضافة هذه الميزة إلى Java و/أو اللغات المكتوبة بشكل ثابت:

  • دعم وقت التشغيل لفئات Java الديناميكية الآمنة من النوع
  • دعم التكيف الديناميكي غير المتوقع لسلوك التطبيق
  • تقنية للتحديث الديناميكي لبرامج جافا

تقدم هذه الورقة لمحة عامة عن المشاكل ذات الصلة

  • تأثير أنظمة الكتابة على التطور الديناميكي للبرمجيات

لست متأكدًا تمامًا مما إذا كان هذا يجيب على سؤالك الأولي، ولكن قد تكون هذه المؤشرات مثيرة للاهتمام لأطروحتك على أي حال.

نصائح أخرى

جافا لغة لا يدعم استبدال ملف الفئة. يعرض JVM الميزة عبر الفصول التي ذكرتها. لذلك كل شيء اللغات التي تم نقلها إلى JVM يمكن الاستفادة منه.

إرلانج يدعم تبديل التعليمات البرمجية الساخنة ، وإذا كنت تبحث أيضًا عن الأطر النظرية التي تحديثات الفئة الديناميكية النموذجية ، فيمكنك إلقاء نظرة على كريول اللغة (تفسير).

تدعم مكتبة وقت تشغيل Objective-C البناء الديناميكي وتسجيل الفئات ، وتسجيل الطريقة البطيئة و "Method Swizzling" التي يمكن من خلالها تبديل تطبيقات الطريقة في وقت التشغيل. دعمت الإصدارات السابقة "Class Swizzling" يمكن من خلالها استبدال الفصل لآخر في وقت التشغيل ، ولكن الآن يتم استخدام Method Swizzling بدلاً من ذلك. ها هي المستند المرجعي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top