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

نظره على Reflection In Java

مغلق
بدأه زائر في 11 يناير 2008 · 9 رد · 3,267 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ماهو Reflection ؟

هي طريقه برمجيه لتراقب أو تعدل على سلوك برنامجك وقت التنفيذ ..

كلنا باستطاعتنا التحكم في برامجنا ولكن عندما تريد ان تراقب او ان تعدل وقت تنفيذ برنامجك في

JVM فإن هذا يعتبر مستحيلاً بدون Reflection اتحدث بالطبع على طريقه جافاويه أو Pure Java context

وبدون Third Party classes مثل BCEL

قبل اي شئ لك ان تتخيل المساوئ والمحاسن لهذه الطريقه بامكانك ان تجعل برنامجك اداء جيد وبامكانك ان تجعله اداء اسوأ

كل ذلك يعتمد على طريقتك في استخدام reflection

في هذا الدرس سأتطرق باختصار إلى :

التعامل مع الكلاس

التعامل مع constructor

التعامل مع الmethods

التعامل مع ال fields

التعامل مع modifiers

التعامل مع الكلاس

import java.lang.reflect.*;

class B{
}
class A extends B{

	String str;

	public void setStr(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

public A(String str){
	setStr(str);
}

	public String toString() {
		return new String(str);
	}



}

class Test {
	public static void main(String args[]) throws Exception{
		Class c=Class.forName("A");
		System.out.println("Class Name : "+c.getName());
		System.out.println("Super Class Name : "+c.getSuperclass());

	}
}

  Class c=Class.forName("A");

كل كلاس ينفذ في JVM له اوبجكت من الكلاس Class

وبالتالي نحن نطلب انشاء اوبجكت ان لم يكن موجوداً للكلاس A او ريفرنس له ان كان موجود

بالطبع تستطيع اعطائه الطريق الكامل للكلاس ( إسم الباكج ..إلخ )

التعامل مع الconstructors :

import java.lang.reflect.*;

class B{
}
class A extends B{

	String str;

	public void setStr(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

public A(String str){
	setStr(str);
}

	public String toString() {
		return new String(str);
	}



}

class Test {
	public static void main(String args[]) throws Exception{
		Class c=Class.forName("A");
		Constructor constructor=c.getConstructor(new Class[]{String.class});
		Object[] arguments=new Object[]{"arabteam2000"};
		System.out.println( constructor.newInstance(arguments));

	}
}

		Constructor constructor=c.getConstructor(new Class[]{String.class});

تحدد أنواع المدخلات للكونستركتر وهنا لدينا كونستركتر وحيد ويقبل ارقيومنت واحد من نوع String

لإنشاء اوبجكت كل ماعليك هو استدعاء الداله newInstance من الكونستركتر اللي تبيه وتمرر لها مجموعة أرقيومنت وفي مثالنا أرسلنا جملة arabteam2000 لإنشاء اوبجكت من الكلاس A

طبعا بامكانك استخدام اكثر من كونستركتر وانشاء اكثر من اوبجكت

#2

مشكور على هذا شرح الجميل

winter-main.jpg

6179.gif

#3

بنت اليمن ، شكراً ( مازلت اتذكر اول رد لي بالمنتدى كان لموضوع لك ! )

yadoo86 ،شكراً

التعامل مع ال methods

import java.lang.reflect.*;

class B{
}
class A extends B{

	String str;

	public void setStr(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

public A(String str){
	setStr(str);
}

	public String toString() {
		return new String(str);
	}



}

class Test {
	public static void main(String args[]) throws Exception{
		Class c=Class.forName("A");
		Constructor constructor=c.getConstructor(new Class[]{String.class});
		Object[] arguments=new Object[]{"arabteam2000"};
		Class [] parameters=new Class[]{String.class};
		Object obj= constructor.newInstance(arguments);
		Method customMethod=c.getMethod("setStr",parameters);
		customMethod.invoke(obj,new Object[]{"saud"});
		System.out.println(((A)obj).getStr());


	}
}

اعتقد ان الكود واضح

قمنا بالاشاره الى الاوبجكت الجديد واستدعينا الداله عن طريق اسمها والبراميتر اللي تاخذها

ومن ثم غيرنا قيمة الحقل str الى سعود او saud

التعامل مع Fields

import java.lang.reflect.*;

class B{
}
class A extends B{

   public String str;

	public void setStr(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

public A(String str){
	setStr(str);
}

	public String toString() {
		return new String(str);
	}

}

class Test {
   public static void main(String args[]) throws Exception{

		A a=new A("saud");
		Class c=a.getClass();
	  Field field=c.getField("str");
	  System.out.println("Old Value :"+ field.get(a));
	  field.set(a,"saad");
	  System.out.println("new Value :"+field.get(a));

	} 
}

لاحظ انه لابد من يكون الحقل public حتى يمكن تغييره واستدعائه

#4

الآن ماذا لو كان الحقل مو public بمعنى كان private مثلاً

هل نستطيع الوصول له ؟ نعم

الداله getField تظهر فقط الpublic fields

لكن الداله getDeclaredField تظهر جميع الحقول سواءاً برايفت او غيره

بامكانك جعل الحقل str private ومن ثم مناداة التالي في المين :

 Field field= c.getDeclaredField("str");
	  field.setAccessible(true);

بدلاً من

Field field=c.getField("str");

والامر نفسه للمثد

التعامل مع modifiers :

import java.lang.reflect.*;

class B{
}
class A extends B{

  private  String str;

	public void setStr(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

public A(String str){
	setStr(str);
}

	public String toString() {
		return new String(str);
	}

}

class Test {
   public static void main(String args[]) throws Exception{

		A a=new A("saud");
		Class c=a.getClass();
	  int mod= c.getModifiers();
	 if(Modifier.isPublic(mod))
		 System.out.println("Class A is public ");
	 else
		 System.out.println("class A is not public ");

		  Class [] parameters=new Class[]{String.class};
		Method customMethod=c.getMethod("setStr",parameters);
	  mod=customMethod.getModifiers();
	  if(Modifier.isPublic(mod))
		  System.out.println(customMethod.getName()+" is public");

	} 
}

للمزيد عن Reflection

http://java.sun.com/docs/books/tutorial/reflect/index.html

#5
اقتباس
بنت اليمن ، شكراً ( مازلت اتذكر اول رد لي بالمنتدى كان لموضوع لك ! )

هذا شرف لي ... و موضوع جميل بجد :)

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#6

السلام عليكم

مشكور على هذا شرح الجميل

بس انا مش فاهمة ليش الشروحات بتبدأ دايما في اوقات الامتحان

استنوا بس تخلص الامتحانات علشان نسال لو في نقطة غامضة

#8

أستاذ يا عيسى و الله

كلمتين بس من الآخــر

أسألكم الدعاء لأبي و أمي

#9

يعطيك العافيه ياعيسى

ماتقصر يالغالي

#10

شرحجميل وحلو ومعلومات لاو مرة اعف عنها

شكرا اخي

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


هذا الموضوع مغلق.

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