Java البرنامج التعليمي لواجهة برمجة تطبيقات الانعكاس مع مثال
⚡ ملخص ذكي
Java تقوم واجهة برمجة تطبيقات Reflection بتحليل وتعديل إمكانيات فئة ما أثناء التشغيل، بما في ذلك حقولها وأساليبها ودوالها البانية. يشرح هذا المورد حزمة java.lang.reflect، والأساليب الرئيسية لفئة java.lang.Class، وأربعة أمثلة لقراءة البيانات الوصفية لفئة ومتغير وأسلوب ودالة بانية.

ما هو الانعكاس في Java?
Java الانعكاس هو عملية تحليل وتعديل جميع إمكانيات فئة ما أثناء وقت التشغيل. واجهة برمجة تطبيقات الانعكاس في Java تُستخدم لمعالجة فئة وأعضائها، والتي تشمل الحقول والأساليب والمنشئات وما إلى ذلك، في وقت التشغيل.
إحدى مزايا واجهة برمجة تطبيقات Reflection في Java إنها تستطيع التلاعب بالأعضاء الخاصين في الفئة أيضًا.
توفر حزمة java.lang.reflect العديد من الفئات لتطبيق تقنية الانعكاس. تُستخدم أساليب فئة java.lang.Class لجمع البيانات الوصفية الكاملة لفئة معينة.
فئة في حزمة java.lang.reflect
فيما يلي قائمة مختلف Java فصول في حزمة java.lang.reflect لتنفيذ الانعكاس:
- حقل: تُستخدم هذه الفئة لجمع المعلومات التصريحية مثل نوع البيانات، ومعدل الوصول، والاسم، وقيمة المتغير.
- الطريقة: تُستخدم هذه الفئة لجمع المعلومات التصريحية مثل مُعدِّل الوصول، ونوع الإرجاع، والاسم، وأنواع المعلمات، ونوع الاستثناء الخاص بالطريقة.
- منشئ: تُستخدم هذه الفئة لجمع المعلومات التصريحية مثل مُعدِّل الوصول والاسم وأنواع المعلمات الخاصة بالمنشئ.
- المعدل: تُستخدم هذه الفئة لجمع معلومات حول مُعدِّل وصول معين.
الطرق المستخدمة في java.lang.Class
- public String getName(): يُعيد اسم الفئة.
- public Class getSuperclass(): يُعيد مرجع الفئة الأصلية.
- public Class[] getInterfaces(): تُرجع هذه الدالة مصفوفة من الواجهات التي تُنفذها الفئة المحددة.
- public int getModifiers(): تقوم هذه الدالة بإرجاع قيمة عددية صحيحة تمثل مُعدِّلات الفئة المحددة، والتي يجب تمريرها كمعامل إلى طريقة "public static String toString(int i)" التي تُرجع مُحدِّد الوصول للفئة المُعطاة.
كيفية الحصول على معلومات كاملة عن الفصل الدراسي
للحصول على معلومات حول المتغيراتبعد تحديد طرق ودوال إنشاء فئة، نحتاج إلى إنشاء كائن من تلك الفئة. يوضح المثال التالي طرقًا مختلفة لإنشاء كائن من الفئة "Class":
public class Guru99ClassObjectCreation { public static void main(String[] args) throws ClassNotFoundException { // 1 - By using Class.forName() method Class c1 = Class.forName("Guru99ClassObjectCreation"); // 2 - By using getClass() method Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); // 3 - By using .class Class c3 = Guru99ClassObjectCreation.class; } }
مثال 1: كيفية الحصول على بيانات الفئة
يوضح المثال التالي كيفية الحصول على البيانات الوصفية مثل اسم الفئة، واسم الفئة الأصلية، والواجهات المنفذة، ومعدلات الوصول للفئة.
سنحصل على البيانات الوصفية للفئة المسماة أدناه Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- اسم الفصل هو: Guru99 قاعدة
- مُعدِّلات الوصول الخاصة به هي: عام ومطلقtract
- لقد نفذت واجهات: قابلة للتسلسل وقابلة للاستنساخ
- بما أنه لم يرث أي فئة بشكل صريح، فإن فئته الأساسية هي: java.lang.Object
سيحصل الصنف أدناه على البيانات الوصفية لـ Guru99Base.class وقم بطباعته:
import java.lang.reflect.Modifier; public class Guru99GetclassميتاData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> guru99ClassObj = Guru99Base.class; // Print name of the class System.out.println("Name of the class is : " + guru99ClassObj.getName()); // Print super class name System.out.println("Name of the super class is : " + guru99ClassObj.getSuperclass().getName()); // Get the list of implemented interfaces using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- اطبع اسم الفئة باستخدام الدالة getName().
- اطبع اسم الفئة الأصلية باستخدام طريقة getSuperclass().getName().
- اطبع أسماء الواجهات المُطبقة.
- اطبع مُعدِّلات الوصول التي تستخدمها الفئة.
مثال 2: كيفية الحصول على بيانات المتغير
يوضح المثال التالي كيفية الحصول على البيانات الوصفية لمتغير ما.
هنا، نقوم بإنشاء فئة باسم Guru99Variable ماتاData.class مع بعض المتغيرات:
package guru; public class Guru99VariableميتاData { public static int guru99IntVar1 = 1111; static int guru99IntVar2 = 2222; static String guru99StringVar1 = "guru99.com"; static String guru99StringVar2 = "Learning Reflection API"; }
خطوات الحصول على البيانات الوصفية حول المتغيرات في الفئة أعلاه:
- أنشئ كائن الفئة للفئة المذكورة أعلاه، أي Guru99Variable ماتاData.class، كما يلي:
Guru99VariableميتاData guru99ClassVar = new Guru99VariableميتاData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- احصل على البيانات الوصفية على شكل مصفوفة حقول باستخدام الحصول على الحقول () or الحصول على الحقول المعلنة () طرق على النحو التالي:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
استخدم الحصول على الحقول () تقوم هذه الطريقة بإرجاع البيانات الوصفية للمتغيرات العامة من الفئة المحددة وكذلك من فئتها الأصلية.
استخدم الحصول على الحقول المعلنة () تقوم هذه الطريقة بإرجاع البيانات الوصفية لجميع المتغيرات من الفئة المحددة فقط.
- احصل على اسم المتغيرات باستخدام طريقة "public String getName()".
- احصل على نوع بيانات المتغيرات باستخدام طريقة "public Class getType()".
- احصل على قيمة المتغير باستخدام الدالة "public xxx get(Field)". هنا، يمكن أن يكون xxx بايتًا أو عددًا صحيحًا قصيرًا أو أي نوع آخر من القيم التي نريد جلبها.
- احصل على مُعدِّلات الوصول للمتغيرات باستخدام طريقتي getModifiers() و Modifier.toString(int i).
هنا، نقوم بكتابة فئة للحصول على البيانات الوصفية للمتغيرات الموجودة في الفئة. Guru99Variable ماتاData.class:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Guru99VariableميتاDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableميتاData.class Guru99VariableميتاData guru99ClassVar = new Guru99VariableميتاData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- تم إنشاء كائن فئة لـ Guru99Variable ماتاData.class.
- تم الحصول على جميع البيانات الوصفية للمتغيرات في مصفوفة الحقول.
- تمت طباعة جميع أسماء المتغيرات في الفئة Guru99Variable ماتاData.class.
- تمت طباعة جميع أنواع البيانات للمتغيرات في الفئة.
- تمت طباعة جميع مُعدِّلات الوصول للمتغيرات في الفئة.
- تمت طباعة قيم جميع المتغيرات في الفئة.
مثال 3: كيفية الحصول على بيانات الطريقة
يوضح المثال التالي كيفية الحصول على البيانات الوصفية لطريقة ما.
هنا، نقوم بإنشاء فئة باسم Guru99Method MATA.class مع بعض الطرق:
package guru; import java.sql.SQLException; public class Guru99MethodميتاData { public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException { System.out.println("Demo method for Reflection API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException { System.out.println("Demo method for Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException { System.out.println("Demo method for Reflection API"); } }
خطوات الحصول على البيانات الوصفية المتعلقة بالأساليب في الفئة المذكورة أعلاه:
- أنشئ كائن الفئة للفئة المذكورة أعلاه، أي Guru99Method ماتاData.class، كما يلي:
Guru99MethodميتاData guru99ClassVar = new Guru99MethodميتاData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- يمكنك الحصول على معلومات الطريقة في مصفوفة الطرق باستخدام الطريقتين getMethods() و getDeclaredMethods() كما يلي:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
استخدم الحصول على الأساليب () تُعيد هذه الطريقة البيانات الوصفية للطرق العامة من الفئة المحددة وكذلك من فئتها الأصلية. getDeclaredMethods() تقوم هذه الطريقة بإرجاع البيانات الوصفية لجميع الطرق من الفئة المحددة فقط.
- احصل على اسم الطريقة باستخدام getName () الأسلوب.
- احصل على نوع القيمة المرجعة للدالة باستخدام getReturnType() الأسلوب.
- احصل على مُعدِّلات الوصول للأساليب باستخدام الحصول على المعدلات () و Modifier.toString(int i) الأساليب.
- احصل على أنواع معلمات الطريقة باستخدام الحصول على المعلمة () طريقة تُرجع مصفوفة من الفئة.
- احصل على الاستثناءات التي تم طرحها باستخدام getExceptionTypes() طريقة تُرجع مصفوفة من الفئة.
هنا، نقوم بكتابة فئة للحصول على البيانات الوصفية للطرق الموجودة في الفئة. Guru99Method ماتاData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodميتاDataTest { public static void main(String[] args) { // Create Class object for Guru99MethodميتاData.class Class guru99ClassObj = Guru99MethodميتاData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- تم إنشاء كائن فئة لـ Guru99Method ماتاData.class.
- تم الحصول على جميع البيانات الوصفية لجميع الطرق في مصفوفة الطرق.
- تمت طباعة جميع أسماء الطرق الموجودة في الفئة.
- تمت طباعة أنواع الإرجاع للأساليب في الفئة.
- تمت طباعة جميع مُعدِّلات الوصول للطرق في الفئة.
- تمت طباعة أنواع معلمات الطرق.
- تمت طباعة الاستثناءات التي تم طرحها بواسطة الطرق.
مثال 4: كيفية الحصول على بيانات المُنشئات
يوضح المثال التالي كيفية الحصول على البيانات الوصفية للمنشئات.
هنا، نقوم بإنشاء فئة باسم Guru99Constructor.class مع مُنشئات مختلفة:
package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException, ArithmeticException { } public Guru99Constructor(int no, String name) throws RemoteException, SQLException { } public Guru99Constructor(int no, String name, String address) throws InterruptedException { } }
هنا، نقوم بكتابة فئة للحصول على البيانات الوصفية للمنشئات الموجودة في الفئة. Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class Guru99ConstructorميتاDataTest { public static void main(String[] args) { // Create Class object for Guru99Constructor.class Class guru99Class = Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- تم إنشاء كائن فئة لـ Guru99Constructor.class.
- تم الحصول على جميع البيانات الوصفية لجميع الدوال البانية في مصفوفة Constructor.
- تمت طباعة جميع أسماء المُنشئات الموجودة في الفئة.
- تمت طباعة جميع مُعدِّلات الوصول الخاصة بالدوال البانية في الفئة.
- تمت طباعة أنواع المعاملات الخاصة بالدوال البانية.
- تمت طباعة الاستثناءات التي تم طرحها بواسطة الدوال البانية.
















