Mohammed Shehata نشر 11 سبتمبر 2021 أرسل تقرير نشر 11 سبتمبر 2021 لماذا نستخدم الreflection في جافا وماهو اصلا 2 اقتباس
0 شرف الدين حفني نشر 11 سبتمبر 2021 أرسل تقرير نشر 11 سبتمبر 2021 مفهوم الإنعكاس (reflection) في لغة جافا يُعبر عن وصف وفحص الشفرة البرمجية , مثال على ذلك إن كان لديك كائن من نوع ما وتريد إستدعاء دالة ما في هذا الكائن ولكن هذا الكائن تم تمريره لك دون معرفة نوعه , بسبب أن جافا من النوع static typed ﻻ يمكنك مناداة دوال هذا الكائن, لكن بمساعدة الإنعكاس يمكنك فعل شئ مثل ذلك Method function = anon.getClass().getMethod("someFunction", null); function.invoke(anon, null); وبوجهٍ عام يتم إستخدام الإنعكاس في مجالات كثيرة, مثل بيئات التطوير المتكاملة (ides) مثل الnetbeans, eclipse حتى يكون قادر على معرفة الدوال والكائنات الموجودة في النظام لديك وعندما نقول أنه يساعد على تحليل الشفرة البرمجية, فإننا نعني ذلك حقاً, حيث يمكنك كشف أي قطعة في الكائن حتي الحقول والدوال الخاصةprivate وكما هو واضح من الإسم "الإنعكاس" فأنه يجعلك قادراً فقط على فحص الشفرة وليس تعديلها , أكثر ما يمكنك فعله من أمور التعديل هو أن تقوم بتغيير إمكانية الوصول للحقول في الكائن, مثلاً تغيير أحد الحقول من خاص إلى عام(private/public) اقتباس
0 Ali Haidar Ahmad نشر 11 سبتمبر 2021 أرسل تقرير نشر 11 سبتمبر 2021 ال reflection هي عبارة عن API تُستخدم لفحص أو تعديل سلوك الدوال و الكلاسات والواجهات في وقت التشغيل (Runtime). حيث يمنحنا القدرة على الوصول لمعلومات الكلاس الذي ينتمي له الكائن %D ال reflection هي عبارة عن API تُستخدم لفحص أو تعديل سلوك الدوال و الكلاسات والواجهات في وقت التشغيل (Runtime). حيث يمنحنا القدرة على الوصول لمعلومات الكلاس الذي ينتمي له الكائن الذي قمنا بتعريفه والدوال التي يمكن تنفيذها واستدعاءها خلال وقت التشغيل كما يمنحنا إمكانية التعامل معها في حالة كانت private أو أيُاً كان محدد الوصول المستخدم. إليك المثال التالي لتوضيح استخدامه حيث سنستخدم فيه أهم التوابع وسنعرَف بها: الدالة getConstructors تستخدم هذه الدالة للحصول على معلومات البواني للكلاس الذي ينتمي له الكائن (البواني العامة public). الدالة getClass ترد هذه الطريقة اسم الكلاس الذي ينتمي له الكائن. الدالة getmethod تعطينا معلومات عن الدوال العامة الموجودة ضمن الكلاس الذي ينتمي له الكائن. يمكننا استدعاء طريقة من خلال الانعكاس عن طريق تمرير اسمها وأنواع الوسطاء إلى الدالة invoke. أو من خلال الدالة getDeclaredMethod كما في المثال التالي. يمكننا من خلال الدالة getDeclaredField الحصول على الحقول ال private في الكلاس الذي ينتمي له الكائن. وأخيراً الدالة setAccessible تسمح لنا بالوصول للحقل أو الدالة بغض النظر عن نوع محدد الوصول. import java.lang.reflect.Field; import java.lang.reflect.Constructor; import java.lang.reflect.Method; // تعريف كلاس class ref { private String str; // تعريف سلسلة // تعريف باني public Test() { str = "Hsoub"; } // تعريف دالة تقوم بطباعة السلسلة public void m1() { System.out.println("my string: " + str); } // دالة أخرى public void me2(int x) { System.out.println("my number: " + x); } } class myprogram { public static void main(String args[]) throws Exception { // إنشاء كائن ليتم التحقق من خصائصه ref o = new ref(); //getClass استخدام الدالة Class c = o.getClass(); System.out.println(c.getName()); //getConstructor استخدام الدالة Constructor const = c.getConstructor(); System.out.println(const.getName()); //getMethods استخدام Method[] methods = c.getMethods(); //getDeclaredMethod الدالة //ألتي ترغب بها method إنشاء كائن من ال Method call1 = c.getDeclaredMethod("m2", int.class); // نقوم بتمرير اسم الطريقة وفئة الوسيط // استدعاء الطريقة خلال وقت النشعيل methodcall1.invoke(o, 5); // 5 // getDeclaredField // مثل السابق لكن للحقول Field myfield = c.getDeclaredField("str"); myfield.setAccessible(true); // السماح للكائن بالوصول للحقل بغض النظر عن محدد الوصول // يأخذ الكائن والقيمة الجديدة المراد تعيينها للحقل كوسائط field.set(o, "HHH"); Method call2 = cls.getDeclaredMethod("m1"); call2.invoke(o); // HHH } } الانعكاس مفيد جداً في العديد من الحالات، ولاسيما عند بناء أدوات التصحيح والاختبار حيث أن المصححات تستخدم الانعكاس لفحص أو اختبار الأعضاء الخاصة private ضمن الكلاس. ,ولكن قد يكون استخدمه فكرة سيئة مع التطبيقات الحساسة للأداء لأنه يجعل الكود أبطأ. اقتباس
السؤال
Mohammed Shehata
لماذا نستخدم الreflection في جافا وماهو اصلا
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.