مرحبا بالجميع!
حسنًا ، قبل "رأس السنة الجديدة" و "بداية الدفق العاشر
" ، يمزح
"Java Developer" تمامًا. لذلك لدينا درس واحد مفتوح نقوم بإعداده للنشر وملاحظة اليوم ، والتي سوف تتعلم منها عن وكيل Java الديناميكي: ما هو عليه ، ومتى وكيفية استخدامه في التعليمات البرمجية.
ما هو الوكيل؟الوكيل هو نمط تصميم. نقوم بإنشائها واستخدامها لإضافة وتغيير وظائف الفئات الحالية. في هذه الحالة ، يتم استخدام كائن الوكيل بدلاً من الكائن الأصلي. عادةً ما تستخدم نفس الطريقة الأصلية ، وفي فئات وكيل Java تقوم بتوسيع الأصناف الأصلية. يمكن أن يستدعي الوكيل طريقة على الكائن المصدر لأنه يحتوي على واصف أصلي.
وبالتالي ، تطبق فئات الوكيل بشكل مريح العديد من الأشياء:
- تسجيل بداية وإيقاف الأسلوب ؛
- تحقق إضافي من الحجج ؛
- تقليد سلوك الفئة المصدر ؛
- تنفيذ التهيئة المؤجلة للموارد المكلفة ؛

كل هذا يحدث دون تغيير رمز الفصل الأصلي. القائمة الكاملة لا تقتصر على الأمثلة المذكورة أعلاه ، فهي ليست سوى جزء صغير منها.
في الممارسة العملية ، لا تطبق فئة الوكيل الوظيفة بشكل مباشر. باتباع مبدأ المسئولية الفردية ، فإن فئة البروكسي تؤدي مباشرة الوكيل فقط ، ويتم تنفيذ تغييرات السلوك في المعالجات. عند استدعاء كائن وكيل بدلاً من الأصل ، يقرر الوكيل ما إذا كان سيتم استدعاء الأسلوب الأصلي أو بعض المعالجات. يمكن للمعالج أداء مهمته الخاصة والرجوع إلى الطريقة الأصلية.
على الرغم من أن نمط الوكيل لا يستخدم فقط لإنشاء كائن وكيل وفئة في وقت التشغيل ، إلا أنه في Java موضوع مثير للاهتمام بشكل خاص. في هذه المقالة ، أركز على هذه الوكلاء.
هذا موضوع معقد يتطلب استخدام فئة الانعكاس ، أو التعامل مع الكود الثنائي ، أو تجميع شفرة جافا التي تم إنشاؤها ديناميكيًا. أو ربما كل ذلك مرة واحدة. لمنع إتاحة الفئة الجديدة كرمز ثانوي في وقت التشغيل ، سوف تكون هناك حاجة إلى إنشاء الرمز الثنائي الذي تم إنشاؤه و classloader لتحميل الرمز الثنائي. لإنشاء bytecode ، استخدم
cglib أو
bytebuddy أو برنامج التحويل البرمجي Java المدمج.
تتضح أهمية الفصل بين المسؤوليات ، في حالتنا ، ما عليك سوى التفكير في فئات الوكيل والمعالجات التي يسمونها. يتم إنشاء فئة وكيل في وقت التشغيل ، لكن يمكن إضافة معالجات البرنامج التي تستدعيها إلى التعليمات البرمجية المصدر العادية وتجميعها مع بقية البرنامج.
كيفية استخدامها في التعليمات البرمجية لدينا؟
أبسط استخدام
java.lang.reflect.Proxy
، وهو جزء من JDK. يمكن لهذه الفئة إنشاء فئة وكيل أو مثيلها مباشرة. استخدام بروكسي مدمج في جافا بسيط للغاية. كل ما عليك القيام به هو تطبيق
java.lang.InvocationHandler
بحيث يمكن أن يطلق عليه كائن الوكيل. واجهة
InvocationHandler
بسيطة للغاية وتحتوي على طريقة واحدة فقط:
invoke()
. عند الاستدعاء ، تحتوي الوسيطات على الكائن الأصلي المعتمد ، والطريقة التي تم استدعاؤها (كانعكاس لكائن
Method
) ومجموعة من الكائنات الخاصة بالوسائط الأصلية. يوضح مقتطف الشفرة أدناه التطبيق:
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkProxyDemo { interface If { void originalMethod(String s); } static class Original implements If { public void originalMethod(String s) { System.out.println(s); } } static class Handler implements InvocationHandler { private final If original; public Handler(If original) { this.original = original; } public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { System.out.println("BEFORE"); method.invoke(original, args); System.out.println("AFTER"); return null; } } public static void main(String[] args){ Original original = new Original(); Handler handler = new Handler(original); If f = (If) Proxy.newProxyInstance(If.class.getClassLoader(), new Class[] { If.class }, handler); f.originalMethod("Hallo"); } }
للاتصال بالطريقة الأصلية للكائن المصدر ، يحتاج المعالج إلى الوصول إليه. ما لا يتم توفيره من خلال تطبيق وكيل Java. ستحتاج إلى تمرير الوسيطة بنفسك إلى مثيل المعالج في التعليمات البرمجية. (انتبه إلى الكائن (عادة ما يسمى الوكيل) ، والذي يتم تمريره كوسيطة إلى المعالج الذي تم الاتصال به. هذا هو كائن وكيل ينشئه Java ديناميكيًا ، وليس الكائن الذي نريد أن نستخدمه الوكيل.) وبالتالي ، يمكنك استخدامه كمنفذ منفصل كائنات المعالج لكل فئة مصدر ، وكذلك كائن عام يعرف كيفية استدعاء الكائن الأصلي ، إذا كان هناك أي طريقة لذلك على الإطلاق.
في الحالة الخاصة ، يمكنك إنشاء معالج اتصال وواجهة وكيل دون الكائن الأصلي. علاوة على ذلك ، فئة لتطبيق واجهة في التعليمات البرمجية المصدر غير مطلوب. يتم تنفيذه بواسطة فئة وكيل تم إنشاؤها ديناميكيًا.
إذا لم تنفذ الفئة التي تمت مشاركتها الواجهة ، فيجب أن تفكر في استخدام بعض تطبيقات الوكيل الأخرى.
النهاية
في انتظار التعليقات والأسئلة الخاصة بك. كما هو الحال دائمًا ، إما هنا ، أو يمكنك الذهاب إلى
Vitaly ليوم مفتوح .