اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

مفهوم الإنعكاس (reflection) في لغة جافا يُعبر عن وصف وفحص الشفرة البرمجية , مثال على ذلك إن كان لديك كائن من نوع ما وتريد إستدعاء دالة ما في هذا الكائن ولكن هذا الكائن تم تمريره لك دون معرفة نوعه , بسبب أن جافا من النوع static typed ﻻ يمكنك مناداة دوال هذا الكائن, لكن بمساعدة الإنعكاس يمكنك فعل شئ مثل ذلك

Method function = anon.getClass().getMethod("someFunction", null);
function.invoke(anon, null);

وبوجهٍ عام يتم إستخدام الإنعكاس في مجالات كثيرة, مثل بيئات التطوير المتكاملة (ides) مثل الnetbeans, eclipse حتى يكون قادر على معرفة الدوال والكائنات الموجودة في النظام لديك

وعندما نقول أنه يساعد على تحليل الشفرة البرمجية, فإننا نعني ذلك حقاً, حيث يمكنك كشف أي قطعة في الكائن حتي الحقول والدوال الخاصةprivate

وكما هو واضح من الإسم "الإنعكاس" فأنه يجعلك قادراً فقط على فحص الشفرة وليس تعديلها , أكثر ما يمكنك فعله من أمور التعديل هو أن تقوم بتغيير إمكانية الوصول للحقول في الكائن, مثلاً تغيير أحد الحقول من خاص إلى عام(private/public) 

 

  • 0
نشر

ال 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 ضمن الكلاس. ,ولكن قد يكون استخدمه فكرة سيئة مع التطبيقات الحساسة للأداء لأنه يجعل الكود أبطأ.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...