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

وراء الكواليس : تعرف على كيفية عمل خاصية ال Code Completition

بدأه delab في 14 يونيو 2008 · 14 رد · 2,503 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في هذا الدرس البسيط، سنحاول تسليط الضور على واحدة من أقوى مميزات الـIDE وهي خاصية اكمال الكود أو الــ Code Completition. وسنبحث عن كيفية عملها وراء الكواليس.

CodeCompletition.PNG

والسر هو التالي :

يقوم الـ Eclipse بترجمة اوتوماتيكية للكود الذي تكتبه، ويضع الملفات المترجمة (.class) في مجلد bin (وهذا افتراضيا). يقوم الــ Eclipse بقراءة ملفات الكلاس المترجمة ويستخلص منها جميع المعلومات المتعلقة بالكلاس مثل الـ Attributs، Methods ... ويعرضها لك في شكل قائمة، ليسهل عليك عملية كتابة اسم اتربيوت معين مثلا (كما في الصورة).

لكن، كيف يقوم الــ Eclipse باستخلاص هذه المعلومات من ملفات الكلاس (المترجمة compiled) ؟

يستعمل الــ Eclipse في هذا تكنلوجيا الــ Java Reflection. هذه التكنلوجيا التي تأتي مدمجة مع الحزمة القياسية للـ JDK ، تسمح لنا بقراءة مكونات كلاس معين واستخلاص مجموعة المعلومات التي يحتويها.

لكن هل من مثال توضيحي؟

طيب، اليكم المثال البسيط التالي :

فلنفرض أنه عندنا الكود التالي :

public class MyClass {

	 private String salamMessage = "Salam Aleekoum!";

	 public String getSalamMessage() {
		  return this.salamMessage;
	 }

	 public void saySalam() {
		System.out.println(salamMessage);
	 }
}

نقوم بترجمة هذا الملف :

javac MyClass.java

سينتج لنا ملف : MyClass.class وهو ملف مترجم compiled.

سنقوم الآن بقراءة المعلومات الموجودة في هذا الكلاس عن طريق برنامج آخر باستخدام الجافا رفلكشن :

 import java.lang.reflect.*;

public class ClassReader {

   public static void main(String[] args) throws Exception {
		Class c = Class.forName(args[0]);
		Field[] fields = c.getDeclaredFields();
		Method[] methods = c.getDeclaredMethods();

	   System.out.println("Description for class: " + c.getName());

	if (fields.length > 0) {
	  System.out.println();
	  System.out.println("Fields:");
	  for (Field field : fields) {
		System.out.println(field);
	  }
	}

	if (methods.length > 0) {
	  System.out.println();
	  System.out.println("Methods:");
	  for (Method method : methods) {
		System.out.println(method);
	  }
	}   
  }
}

لاحظ جيدا هذا الجزء من الكود السابق :

Class c = Class.forName(args[0]);
		Field[] fields = c.getDeclaredFields();
		Method[] methods = c.getDeclaredMethods();

قم بترجمة البرنامج :

javac ClassReader.java

ثم قم بتنقيذه مع اعطائه اسم الكلاس الذي تريد أن تقرأ مكوناته. وهنا في المثال، سنقرأ مكونات الكلاس الذي أنشأناه من قبل MyClass :

java ClassReader MyClass

سيعرض لك البرنامج ما يلي :

Description for class: MyClass

Fields:
private java.lang.String MyClass.salamMessage

Methods:
public java.lang.String MyClass.getSalamMessage()
public void MyClass.saySalam()

وهكذا، استطعنا قراءة مكونات كلاس مترجم، عن طريق برنامج آخر مستقل، ويمكن استخدام هذا الأخير لقراءة محتوى أي كلاس مترجم آخر.

هل هناك طرق أخرى غير الــ Java Reflection تستخدم في خاصية اكمال الكود؟

نعم، ومن بينها مثلا استعمال ملفات XML

هل من أفكار أخرى لتطبيق الـ Java Reflection ؟

نعم، خذ مثلا فكرة انشاء برنامج يقوم برسم UML Class Diagram للكلاسات التي تقدمها له بطريقة اوتوماتيكية.

شكرا.

تم تعديل هذه المشاركة بواسطة delab في 15 يونيو 2008 في 00:12

#2

جافا تستخدمها في قواعد البيانات

يمكن الاستفادة منها في توسيع البرامج

من خلال إضافة فئات جديدة إلى البرنامج plug-ins

بصراحة ممكن أن نقول java Reflection

ضرورية جداً

وهي خطوة إلى البرامج الذكية

التي تقوم بتعديل نفسها بنفسها

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

هذا يفتح الشهية لأفكار جميلة...

خذ مثلا بناءا على مشاركة الأخ alaadiaa، برنامج يقوم بانشاء جداول SQL اوتوماتيكيا بناءا على بنية الكلاس. :happy:

#4

موضوعك أخي delab

هو الذي يفتح الشهية

بصراحة قلة ما يمر علينا في القسم هنا

من هم على شاكلتك

لا أعرف لماذا يظن الجميع

أن المنتديات وجدت للسؤال

أقول السؤال وأعني السؤال بالمعنى الحرفي

فلا وجود للنقاش عندهم على الإطلاق

بالنسبة لموضوع برنامج يقوم بانشاء جداول SQL اوتوماتيكياً

هناك مشاكل كثيرة ستواجهك في هذه الفكرة

بدون استخدام ملفات مساعدة (xml مثلاً)

مثلاُ كيف يمكنك معرفة إذا كان الحقل يمثل مفتاحاً

على العموم هناك تقنية تقوم على هذا الموضوع

تسمى hibernate وهي مفتوحة المصادر

يمكن تحميلها من www.hibernate.org

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

.. في الـ .NET أيضا ً تقوم بعمل object datasource .. ثم تسحب الأوبجكت فيقوم بتوليد واجهة لك أتوماتيكيا ...

شكرا لك أخ delab على مواضيعك الرائعة .. و أتمنى لك التوفيق

SCJP 5.0

#6
alaadiaa كتب:
مثلاُ كيف يمكنك معرفة إذا كان الحقل يمثل مفتاحاً

بامكاننا استخدام الــ Annotations، فالجافا رفلكشن بامكانها أيضا استنباطها من بين مكونات الكلاس. أنظر مثلا في أمر الــ EJB3 فهي تعتمد كثيرا على الـ Annotations.

وكحل، يمكننا مثلا كتابة الكود التالي :

	  public class Product {

		@identifier
		public int productID;

		public String label;
		public int quantity;
}

تم تعديل هذه المشاركة بواسطة delab في 15 يونيو 2008 في 01:11

#7

جميل جداً

بصراحة أنا من الجيل القديم في جافا

وهذه ال أخ Annotations ما أنفك أنساها

مع أني وجدتها مفيدة جداً وتحل كثير من المشاكل في بيئة J2EE

لكن النسيان هو النسيان

على العموم هكذا تكون الفكرة قابلة للتنفيذ جداً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

مقال أكثر من رائع جزاك الله خيراً

لي أمنية اتمنى أن تتحق عما قريب وهي:

نلاحظ كثرة التقنيات والأدوات التي دخلت على الجافا لتسهيل العمل وتسريعه ... لكن ليس هناك مقال عربي يتحدث عنها ولو باختصار، مثال عن التقنيات:

struts

hibernate

EJB (حالياً أقرأ كتاب عنها اسمه EJB.3.Developer.Guide.May.2008)

spring

والكثير من الأدوات التي أسمع بها ولا أعرف ماهي وظيفتها

طبعاً الموضوع يتناول فقط أشهر وأهم هذه الأدوات الجديدة فقط.

ويمكن طرح الموضوع في العدد القادم من المجلة !!!

لماذا لا يكون العدد القادم مميزاً ؟؟ ولماذا لا يشارك الجافاويين به (أنا مشجع كبير للجافا ولكن مستواي متوسط بها) ؟؟ عيب والله عيب !!

حالياً أنا أعمل على موضوع بالمجلة هذا سبب لاعتذر عن عدم قدرتي على المشاركة في هذا الموضوع والسبب الثاني عدم معرفتي لقسم من هذه التقنيات والمكتبات

ما رأيكم دام فضلكم؟؟؟

تم تعديل هذه المشاركة بواسطة خالد_الحوراني في 15 يونيو 2008 في 18:13

#9
خالد_الحوراني كتب:
طبعاً الموضوع يتناول فقط أشهر وأهم هذه الأدوات الجديدة فقط.

ويمكن طرح الموضوع في العدد القادم من المجلة !!!

في الحقيقة، أعتقد أنه لا يمكن استوفاء حظ جميع تلك التكنلوجيات في موضوع واحد... لذلك ما سنحاول القيام به، هو بدل الدخول إلى عالم الجافا المؤسساتي (Java Enterprise Edition) دخلة واحدة، سنحاول تجميع بعض المفاهيم والأدوات التي من شأنها بأن تقلل الصدمة وتحسن الفهم وتجسده.

والــ Java Reflection الذي تحدثنا عنه في هذا الموضوع، لا تخل تكنلوجيا واحدة من التي ذكرتها من استعمالها. لذلك يوم نأتي مثلا إلى الـ EJB3 ونذكر بأنه يستعمل الــ Annotations، يكون للاخوة فكرة مسبقة، وفهم لماذا هو مستعمل (شكر جزيل للأخ alaadiaa على اثارة هذا التساؤل)، لذلك سيسهل عليهم التعلم بمشيئة الله تعالى. وشعارنا في ذلك : "إذا عرف السبب، بطل العجب" :lol:

شكرا.

#10

لذلك قلت باختصار ...

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

الفكرة هي مجرد طرح تعريف عن التقنية او المكتبة وبماذا يمكن الاستفادة منها (وظيفتها) بحيث لا يتجاوز 5 أسطر

5 أسطر ضرب 5 تقنيات = 25 سطر ممتاز جداً

والهدف منها هو تعريف المستخدمين بوجود مثل هذه التقنيات لتسهيل حياتهم ... وبذكر الملخص سيعرف المستخدم وظيفتها وسيكمل مسيرة تعلمها لوحده

#11

فقط للمعلوميه ولمن يتسائل عن reflection

/index.ph...=148671&hl=

#12

السلام عليكم

ما رأيكم ان ننقل الحوار الى قسم الـ J2EE

و نناقش معلوماتنا عن هذه التقنيات واحدة تلو الاخرى

ثم نكون مقالات مشتركة ...

رغم اني منشغلة جداً هذه الايام ... لكني احب ان اشترك في هذا المشروع

اقصد مشروع انتاج مقالات مشتركة بناء على مناقشات متبادلة بيننا

ما رأيكم .

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

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

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

#13

على بركة الله ويمكن أقدر أساعدكم بس مش وعد

#15

جميل جداً ... طبعاً حتى لا نلخبط الموضوع هنا .. اقترح ان نبدأ بوضع فهرس للمواضيع المراد مناقشتها في قسم الـ J2EE

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

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

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

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