الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

وراء الكواليس : كيف يمكننا تغيير عمل برنامج من دون تغيير الكود سورس؟

بدأه delab في 28 يونيو 2008 · 6 رد · 1,240 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في هذا الدرس البسيط، سنحاول تسليط الضوء على واحدة من أقوى التكنولوجيات المستخدمة في مجالات كثيرة ومن بينها خادمات البرمجيات (أو Application servers) والتي بموجبها يستطيع الخادم تغيير عمل برنامج اعطي له على شكل ملف مأرشف (jar, war, ...) من دون تغيير الكود سورس. وتغيير العمل يعني مثلا اضافة خصائص إلى هذا البرنامج لم تكن موجودة فيه كالـ Authentification, logging, Transaction management...

ما كل هذا التعقيد ؟؟!!!

طيب، خلينا نبسط الأمور إلى أقصى حد، ولنأخذ المثال الحلو والظريف التالي :

فلنفرض بأنه عندنا برنامج على شكل ملف jar، وأردنا اضافة شيء ما إلى هذا البرنامج مباشرة من دون تغيير كوده الداخلي.

aspectJ6.PNG

مثلا عندنا البرنامج hello.jar (انظر في المرفقات) والذي يقوم بعرض العبارة التالية على الشاشة :

aspectJ1.PNG

وأردنا اضافة تحية السلام قبل هذه العبارة (كما في الصورة أسفله)، وذلك من دون تغيير الكود سورس لهذا البرنامج :

aspectJ2.PNG

اتضحت الصورة؟ طيب فما الحل؟

من بين الحلول المقترحة مثلا، هو استعمال أدوات الهندسة العكسية، غير أن تحويل البرنامج إلى كود سورس، اضافة التعديل ثم اعادة ترجمة البرنامج من جديد يأخذ وقت معتبر.

طيب، واحد آخر قد يقترح علينا استخدام الأدوات التي تستطيع النظر داخل مكونات البرنامج المترجم ثم اضافة التغييرات التي نريد. هذا حل سليم وهو مستعمل كثيرا، غير أنه ليس في متناول الجميع للتعقيد الكبير في التعامل مع الــ Bytecode.

طيب، فما رأيكم بأن نستعمل الـ : Aspect Oriented Programming.

ماهذا الكلام؟ ماذا نقصد بهاذي الــ AOP؟

وحدة وحدة,,,,

------------------------------------------------------------------------------------------------------------------------------------------------------------------

طيب,

لو نعود إلى برنامجنا الضحية hello.jar ، ولنفرض بأنه عندنا الكود سورس الخاص بهذا البرنامج وهو التالي :

aspectJ3.PNG

فعرض عبارة السلام يعني اضافة تعليمة لعرض الجملة Salam aleekoum, قبل الجملة How are you? (أو في بداية الميثود main)، وبطريقة كودية، يجب بأن يكون لدينا البرنامج التالي :

aspectJ4.PNG

ماذا لو كان عندنا برنامج يقوم بهذه الخدمة؟؟!! وعلى برامج مترجمة أصلا، وفي أثناء تنفيذ البرنامج!!

يعني تقدم له مثلا الطلب التالي وهو يقوم بالتنفيذ :

اقتباس
"الله يرحم والديك! من فضلك! والله انت برنامج بن حلال (لست من جماعة القرصنة) ومعروف عليك تساعد الناس، لي عندي طلب بسيط لو تفظلت : قبل أن تنفذ الأوامر الموجودة في الميثود main للبرنامج hello قم باضافة عبارة تقوم بعرض تحية السلام".

لكن هذا البرنامج للأسف لا يفهم العربية، خليها اذن انجليزي :

اقتباس
please, before executing the main method, add the following code :

System.out.println("Salam aleekoum,");

thanks

فماذا لو قلت لكم بأن هذا الأمر موجود فعلا، وهو ليس من أمور المشعوذين والسحرة :)

وهو ما نسميه الـ AspectJ.

وفي لغة الـ AspectJ نقوم بكتابة الطلب الذي عبرنا عنه فوق بالعربي ثم بالانجليزي كالتالي :

aspectJ5.PNG

أنظروا كم هي سهلة اللغة التي يستعملها الـ AspectJ وكم هو قريب من لغة الجافا. في الحقيقة هو طبقة اضافية فوق الجافا.

------------------------------------------------------------------------------------------------------------------------------------------------------------------

فلنقم بتنظيم أوراقنا من جديد ولنضع المخطط التالي لكيفية عمل الــ AspectJ في هذه الحالة :

AspectJ_delab.PNG

- لدينا البرنامج الضحية hello.jar (أو الكلاس Hello).

- لدينا الكود الذي سيحقن في مواقع معية في الكلاس Hello. والكود في هذه الحالة هو الأمر الذي يعرض تحية السلام، وموقع الحقن هو قبل بداية تنفيذ الميثود main (السطر 3).

- ولدينا في النهاية البرنامج الذي يقوم بعملية الحقن في المكان المناسب عند تشغيل البرنامج hello والذي هو الـ AspectJ. ويستعمل في هذا الحقنة HelloAspect.

انتهى، ماعليك سوى الضغط على الأبرة :S

أفضل بأن نتوقف هنا، ومن أراد تعلم عملية الحقن، فليتبع دروس الطبيب aspectJ :D

والله ولي التوفيق.

شكرا.

تم تعديل هذه المشاركة بواسطة delab في 28 يونيو 2008 في 02:32

#2

ياسلام

ماشاء الله - موضوع بسيط وجميل 0

وين زر الشكرر :clapping:

#3

الجانب التطبيقي :

سنعرض في هذه المشاركة كيفية تشغيل المثال السابق.

سنحتاج إلى البرمجيات التالية :

- Ant (راجع الموضوع التالي هنا أو اتبع الخطوات المباشرة هنا)

- AspectJ (قم بتحميل البرنامج من الموقع التالي)

- وطبعا الــ JDK

اضافة المعلومة ASPECTJ_HOME إلى متغيرات النظام (اعتذر الصور معمولة من نظام تشغيل فرنسي) :

aspectJ7.PNG

اضغط على اضافة، وادخل المعلومات التالية (في السطر الثاني، ضع المكان الذي ثبت فيه برنامج الـ AspectJ) ثم اضغط على موافق:

aspectJ8.PNG

قم بتحميل المشروع من المرفقات (hello_aspectj.zip) ثم قم بتفريغه في مكان معين.

يحتوي هذا المشروع على الملفات التالية :

- build.xml المسؤول عن تنظيم عملية البناء باستخدام الأداة Ant

- فأر التجارب hello.jar

- المجلد aspects ، والذي يحتوي على الملف HelloAspect.java وهو ما يمكن أن نطلق عليه الحقنة.

لتشغيل برنامج hello من دون حقن، قم بتنفيذ الأمر التالي :

java -jar hello.jar

ستظهر لك عبارة How are you؟ وهو المطلوب.

الآن سنقوم بتشغيل نفس البرنامج ولكن مع حقنة AspectJ ، والتي من شأنها اضهار عبارة Salam Aleekoum, في أول الشاشة قبل عبارة How are you؟.

شكرا للأداة Ant، فلبناء هذا البرنامج ما عليك سوى طباعة الأمر ant، وكل العمل سيتم في الخفاء، وستظهر لك النتيجة التالية :

aspectJ9.PNG

وهو المطلوب.

بامكانك الآن اللعب قليلا مع فأر تجاربنا بتغيير الحقنة HelloAspect.java، فمثلا نضيف عبارة Fine! بعد الجملة How are you؟

أو نقوم باظهار شاشة تسجيل (طلب اسم المستخدم وكلمة السر) عند تشغيل البرنامج....وهكذا دواليك.

الجميل في الأمر، أنه بامكاننا استعمال هذه الحقنة مع جميع البرامج (التي تحتوي على الميثود main).

حظا موفقا.

hello_aspectj.zip

تم تعديل هذه المشاركة بواسطة delab في 28 يونيو 2008 في 02:01

#4

في الصورة الأخيرة في المشاركه الأولي أليس من المفروض ان ما سيتم حقنه هو السطر before ؟!!

تم تعديل هذه المشاركة بواسطة hazzoom في 28 يونيو 2008 في 01:10

#5

معالجة موفقة يادكتور

merci

#6
hazzoom كتب:
في الصورة الأخيرة في المشاركه الأولي أليس من المفروض ان ما سيتم حقنه هو السطر before ؟!!

هذه كلمة مفتاحية بالنسبة للـ AspectJ، وتسمى في مصطلحات هذا الأخير : Advice.

ولها أخوات مثل :

after : يعني بعد تنفيذ الميثود

around : يعني من حوالي الميثود ، أو قبل وبعد التنفيذ.

#7

أهااا آسف جدا حدث عندي سوء فهم.. يعني سيحدث ما يشبه Patching.

تم تعديل هذه المشاركة بواسطة hazzoom في 28 يونيو 2008 في 01:40

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…