في هذا الدرس البسيط، سنحاول تسليط الضور على واحدة من أقوى مميزات الـIDE وهي خاصية اكمال الكود أو الــ Code Completition. وسنبحث عن كيفية عملها وراء الكواليس.
والسر هو التالي :
يقوم الـ 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 للكلاسات التي تقدمها له بطريقة اوتوماتيكية.
شكرا.
