كيف يمكنني تحديد سياق Java Applet الذي يعمل دون تمرير معرف؟

StackOverflow https://stackoverflow.com/questions/7269

  •  08-06-2019
  •  | 
  •  

سؤال

أنا جزء من فريق يقوم بتطوير تطبيق Swing Java الصغير جدًا.معظم أكوادنا قديمة وهناك الكثير من المراجع المفردة.لقد قمنا بتجميعها جميعًا في "سياق التطبيق" واحد.ما نحتاجه الآن هو إنشاء طريقة ما لفصل السياق المشترك (المشترك عبر جميع التطبيقات الصغيرة المعروضة حاليًا) والسياق غير المشترك (خاص بكل تطبيق صغير معروض حاليًا).

ومع ذلك، ليس لدينا معرف في كل موقع من المواقع التي تتصل بالرقم الفردي، ولا نريد نشر المعرف إلى جميع المواقع.ما هي أسهل طريقة لتحديد سياق التطبيق الصغير الذي نقوم بتشغيله؟(لقد حاولت العبث مع أدوات تحميل الفصول الدراسية ومجموعات المواضيع ومعرفات المواضيع ...حتى الآن لم أجد أي شيء يمكّنني من تحديد أصل المكالمة).

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

المحلول

المفردات شريرة، ماذا تتوقع؟;)

ربما يكون الأسلوب الأكثر شمولاً هو تحميل الجزء الأكبر من التطبيق الصغير في أداة تحميل فئة مختلفة (استخدم java.net.URLClassLoader.newInstance).ثم استخدم WeakHashMap لربط أداة تحميل الفئة بالبرنامج الصغير.إذا كان بإمكانك تقسيم معظم التعليمات البرمجية إلى مُحمل فئة مشترك (كأصل لكل مُحمل فئة لكل تطبيق صغير) وإلى قاعدة تعليمات التطبيق الصغير العادية، فسيكون ذلك أسرع ولكن المزيد من العمل.

الاختراقات الأخرى:

إذا كان لديك حق الوصول إلى أي مكون، فيمكنك استخدام Component.getParent بشكل متكرر أو SwingUtilities.getRoot.

إذا كنت في مؤشر ترابط مثيل لكل تطبيق صغير، فيمكنك إعداد ThreadLocal.

من EDT، يمكنك قراءة الحدث الحالي من قائمة الانتظار (java.awt.EventQueue.getCurrentEvent())، وربما العثور على مكون من ذلك.بدلاً من ذلك، قم بدفع EventQueue باستخدام أسلوب SubmitEvent الذي تم تجاوزه.

نصائح أخرى

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

فيما يتعلق بـ AOP، يجب ألا تكون هناك مشكلة في استخدامه في التطبيقات الصغيرة لأنه، اعتمادًا على نقاط القطع الخاصة بك، يتم نسج النصائح في وقت الترجمة ويتم إضافة JAR إلى تبعيات وقت التشغيل.وبالتالي، لا ينبغي أن يبقى أي دليل خاص على AOP في وقت التشغيل.

Hugo بخصوص Threadlocal:

فكرت في هذا الحل.ومع ذلك، من خلال التجارب وجدت مشكلتين مع هذا النهج:

  1. يمثل مؤشر الترابط المشترك (اتصالات الخادم، وما إلى ذلك) مشكلة.يمكن حل هذه المشكلة من خلال إيلاء اهتمام خاص لهذه المواضيع (جميعها تحت سيطرتي وهي معزولة إلى حد كبير عن الكود القديم).
  2. تتم مشاركة مؤشر ترابط EDT عبر جميع التطبيقات الصغيرة.لقد فشلت في العثور على طريقة لفرض إنشاء سلسلة رسائل EDT جديدة لكل برنامج صغير.وهذا يعني أنه سيتم مشاركة Threadlocal لـ EDT عبر التطبيقات الصغيرة.هذا ليس لدي أي فكرة عن كيفية حلها.اقتراحات؟
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top