تنظم هذه المقالة نقاط المعرفة للعوامل الديناميكية Java ، والمحتوى المحدد هو كما يلي
1. جافا الوكيل الديناميكي (البيان الرسمي المقارن)
نموذج الوكيل هو نموذج تصميم Java شائع الاستخدام. خاصتها هي أن فئة الوكيل وفئة المندوب لها نفس الواجهة. فئة الوكيل مسؤولة بشكل أساسي عن رسائل المعالجة المسبقة ، وتصفية الرسائل ، وإعادة توجيه الرسائل إلى فئة المندوب ، ومعالجة الرسائل بعد الحدث. عادة ما يكون هناك ارتباط بين فئة الوكيل وفئة المندوب. يرتبط كائن فئة الوكيل بكائن فئة مندوب. لا يقوم كائن فئة الوكيل نفسها بتنفيذ الخدمة حقًا ، ولكنه يوفر خدمات محددة من خلال استدعاء الأساليب ذات الصلة لكائن فئة المندوبين.
وفقًا لفترة إنشاء الوكيل ، يمكن تقسيم فئات الوكيل إلى نوعين.
الوكيل الثابت: تم إنشاؤه بواسطة المبرمجين أو يقومون تلقائيًا بإنشاء التعليمات البرمجية المصدرية عن طريق أدوات محددة وتجمعها. قبل تشغيل البرنامج ، يوجد ملف .class لفئة الوكيل بالفعل.
الوكيل الديناميكي: يتم إنشاؤه ديناميكيًا باستخدام آلية الانعكاس عند تشغيل البرنامج.
2. تنفيذ الوكيل الديناميكي
java.lang.reflect.proxy ،
يوفر Proxy طرقًا ثابتة لإنشاء فئات وحالات وكيل ديناميكي.
Newproxyinstance ()
إرجاع مثيل من فئة الوكيل للواجهة المحددة التي يمكنها تعيين مكالمات الطريقة إلى معالج المكالمات المحدد.
2.1. واجهة DAO (توفر واجهة طبقة الوصول إلى البيانات المحاكاة)
حزمة javaproxy ؛/** حدد واجهة طبقة الوصول إلى البيانات*/واجهة عامة DAO {// 2.2. فئة تنفيذ فئة DAOIMPL
حزمة Javaproxy. الفئة العامة DAOIMPL تنفذ DAO {Override public void save () {system.out.println ("تنفيذ طريقة حفظ ................") ؛ }} 2.3. فئة معالجة الوكيل
حزمة Javaproxy. استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ الفئة العامة daoHandler تنفذ invocationHandler {private object obj ؛ public daoHandler (Object obj) {this.obj = obj ؛} ouverride الكائن العام invoke (proxy object ، method method ، object [] args) remable there {system.out.println ("do some قبل الطريقة") ؛ args) ؛ System.out.println ("افعل شيئًا بعد الطريقة") ؛ // يتم محاكاة بعد مرحلة AOP هنا ؛ }} 2.4. مكالمة العميل
حزمة Javaproxy. استيراد java.lang.reflect.proxy ؛ عميل الفئة العامة {public static void main (string [] args) {// metaObject (كائن proxed) daoimpl daoimpl = new daoimpl () ؛ // Business Proxy Class DaoHandler DaoHandler = New DaoHandler (Daoimpl) ؛ dao dao = (dao) proxy.newproxyinstance (daoimpl .getClass (). dao.save () ؛ }}2. 5. النتائج
3. محاكاة تنفيذ الوكيل في MyBatis
3.1. فئة MapPerproxy
حزمة javaproxy ؛ استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ استيراد java.lang.reflect.proxy ؛ الطبقة العامة mapperproxy تنفس عبر invocationhandler {suppresswarnings ("غير unchecked") param: تنفيذ طريقة مع sqlsession** return: إرجاع كائن الوكيل*/ ثابت عام <T> t newmapperproxy (الفئة <T> mapperinterface ، كائن sqlsession) {classloader classloader = mapperinterface.getClassLoader () ؛ فئة <؟> [] واجهات = فئة جديدة [] {mapPerInterface} ؛ mapperproxy proxy = new mapperproxy () ؛ إرجاع (t) proxy.newproxyinstance (classloader ، واجهات ، وكيل) ؛ } / * * (غير javadoc) * * see java.lang.reflect.invocationHandler#Invoke (java.lang.object ابحث عن خريطة المعلمة المقابلة** @RETURN: إرجاع كائن المعلمة المُنفِّل*/ كائن عام استدعاء (وكيل الكائن ، الطريقة ، الكائن ، الكائن [] args) يلقي رمي {// هنا ، يتم تنفيذ العملية المقابلة عن طريق تحليل الخريطة المقابلة من خلال اسم الطريقة والمعلمات system.out.println ("تنفيذ الطريقة الفعلية هنا") ؛ العودة لاغية. }} 3.2. عميل
حزمة Javaproxy. استيراد java.lang.reflect.proxy ؛ عميل الفئة العامة {public static void main (string [] args) {dao dao = mapperproxy.newmapperproxy (dao.class ، null) ؛ dao.save () ؛ }}3.3. نتائج
ما سبق هو مثال على استخدام الوكيل الديناميكي JDK. آمل أن يكون من المفيد للجميع تعلم برمجة Java.