Java البرنامج التعليمي لواجهة برمجة تطبيقات الانعكاس مع مثال

ما هو الانعكاس في Java?

Java الانعكاس هو عملية تحليل وتعديل جميع إمكانيات الفصل في وقت التشغيل. واجهة برمجة تطبيقات الانعكاس في Java يتم استخدامه لمعالجة الفصل وأعضائه بما في ذلك الحقول والأساليب والمنشئ وما إلى ذلك في وقت التشغيل.

إحدى مزايا واجهة برمجة تطبيقات الانعكاس في Java هو أنه يمكنه التلاعب بالأعضاء الخاصين في الفصل أيضًا.

توفر الحزمة java.lang.reflect العديد من الفئات لتنفيذ الانعكاس java. يتم استخدام أساليب فئة java.lang.Class لجمع بيانات التعريف الكاملة لفئة معينة.

فئة في حزمة java.lang.reflect

فيما يلي قائمة مختلف Java فصول في java.lang.package لتنفيذ الانعكاس-

  • الحقل: يتم استخدام هذه الفئة لجمع المعلومات التعريفية مثل نوع البيانات ومعدل الوصول واسم وقيمة المتغير.
  • الأسلوب: يتم استخدام هذه الفئة لجمع المعلومات التعريفية مثل معدل الوصول ونوع الإرجاع والاسم وأنواع المعلمات ونوع الاستثناء للطريقة.
  • منشئ: يتم استخدام هذه الفئة لجمع المعلومات التعريفية مثل معدل الوصول والاسم وأنواع المعلمات الخاصة بالمنشئ.
  • تغيير: يتم استخدام هذه الفئة لجمع معلومات حول معدّل وصول معين.

الطرق المستخدمة في java.lang.Class

  • سلسلة عامة getName (): إرجاع اسم الفئة.
  • الطبقة العامة getSuperclass(): إرجاع مرجع الفئة الفائقة
  • الفئة العامة[] getInterfaces() : إرجاع مجموعة من الواجهات التي تم تنفيذها بواسطة الفئة المحددة
  • عام في getModifiers (): تُرجع قيمة عددية تمثل معدِّلات الفئة المحددة والتي يجب تمريرها كمعلمة إلى "سلسلة ثابتة عامة إلى سلسلة (int i)" الطريقة التي ترجع محدد الوصول للفئة المحددة.

كيفية الحصول على معلومات كاملة عن الفصل الدراسي

للحصول على معلومات حول المتغيراتوالأساليب ومنشئي الفصل، نحتاج إلى إنشاء كائن من الفصل.

الطرق المستخدمة في java.lang.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;
		}
	}
  • يوضح المثال التالي طرقًا مختلفة لإنشاء كائن من فئة "class":
  • مثال 1: كيفية الحصول على البيانات الوصفية للفئة

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

    سوف نحصل على البيانات الوصفية للفئة أدناه المسماة Guru99Base.class:

    الحصول على البيانات الوصفية للفئة

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. اسم الفصل هو: Guru99Base
    2. معدّلات الوصول الخاصة بها هي: عامة ومجردة
    3. لقد نفذت واجهات: قابلة للتسلسل وقابلة للاستنساخ
    4. نظرًا لأنه لم يقم بتوسيع أي فئة بشكل صريح، فإن فئتها الفائقة هي: java.lang.Object

    سيحصل الفصل أدناه على البيانات التعريفية الخاصة بـ Guru99Base.class ويطبعها:

    الحصول على البيانات الوصفية للفئة

    import java.lang.reflect.Modifier;
    public class Guru99GetclassMetaData {
    
    	public static void main (String [] args) throws ClassNotFoundException { 
    	// Create Class object for Guru99Base.class 
    	Class 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 in the form of Class array using getInterface() method
    	class[] guru99InterfaceList = guru99classObj.getInterfaces();
    	
    	// Print the implemented interfaces using foreach loop 
    	system.out.print("Implemented interfaces are : ");
    	for (Class guru99class1 : quru99 InterfaceList)	{
    		system.out.print guru99class1.getName() + " ");
    	}
    	system.out.println();
    	
    	//Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class
    	int guru99AccessModifier= guru99classObj.getModifiers(); 
    	// Print the access modifiers
    	System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));
    	
    	}
    }
    
    1. اطبع اسم الفصل باستخدام طريقة getName
    2. اطبع اسم الفئة الفائقة باستخدام طريقة getSuperClass().getName()
    3. اطبع اسم الواجهات المنفذة
    4. اطبع معدّلات الوصول التي يستخدمها الفصل

    الحصول على البيانات الوصفية للفئة

    الحصول على البيانات الوصفية للفئة

    مثال 2: كيفية الحصول على البيانات الوصفية للمتغير

    فيما يلي أمثلة توضح كيفية الحصول على بيانات التعريف للمتغير:

    هنا، نقوم بإنشاء فئة باسم Guru99VariableMetaData .class مع بعض المتغيرات:

    package guru;
    public class Guru99VariableMetaData {				
                   public static int guru99IntVar1=1111;
                   static int guru99IntVar2=2222;							
                   static String guru99StringVar1="guru99.com";							
                    static String guru99StringVar2="Learning Reflection API";    
    }	
    
    خطوات الحصول على البيانات الوصفية حول المتغيرات في الفئة أعلاه:
    1. قم بإنشاء كائن فئة من الفئة أعلاه، أي Guru99VariableMetaData.class على النحو التالي:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. احصل على البيانات الوصفية في شكل مصفوفة حقل باستخدام الحصول على الحقول () or الحصول على الحقول المعلنة () طرق على النحو التالي:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    الحصول على الحقول () تقوم الطريقة بإرجاع البيانات التعريفية للمتغير العام من الفئة المحددة وكذلك من فئتها الفائقة.

    الحصول على الحقول المعلنة () تقوم الطريقة بإرجاع البيانات التعريفية لجميع المتغيرات من الفئة المحددة فقط.

    1. احصل على اسم المتغيرات باستخدام طريقة "public String getName()".
    2. احصل على نوع بيانات المتغيرات باستخدام طريقة "getType() للفئة العامة".
    3. احصل على قيمة المتغير باستخدام طريقة "public xxx get (Field)".

      هنا، يمكن أن يكون xxx بايتًا أو أقل من أي نوع من القيمة التي نريد جلبها.

    4. احصل على معدّلات الوصول للمتغيرات باستخدام أساليب getModifier() وModifier.toString(int i).

      نحن هنا نكتب فصلًا للحصول على البيانات الوصفية للمتغيرات الموجودة في الفصل Guru99VariableMetaData .class:

      الحصول على البيانات الوصفية للمتغير

      package guru;
      import java.lang.reflect.Field; 
      
      public class Guru99VariableMetaDataTest {
      	public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { 
      	// Create Class object for Guru99VariableMetaData.class 
      	Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); 
      	Class guru99ClassObjVar = guru99ClassVar.getClass();
      	
      	// Get the metadata of all the fields of the class Guru99VariableMetaData 
      	Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields();
      	
      	// Print name, datatypes, access modifiers and values of the varibales of the specified class 
      	for(Field field : guru99Field1) { 
      	System.out.println("Variable name : "+field.getName());
      	System.out.println("Datatypes of the variable :"+field.getType());
      	
      	int guru99AccessModifiers = field.getModifiers();
      	System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));
      	System.out.println("Value of the variable : "+field.get(guru99ClassVar));
      	System.out.println();
      	system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;
      	}
      	}
      }
      
      1. تم إنشاء كائن فئة لـ Guru99VariableMetaData.class
      2. حصلت على جميع البيانات الوصفية للمتغيرات في مصفوفة الحقل
      3. طباعة كافة أسماء المتغيرات في فئة Guru99VariableMetaData.class
      4. طباعة كافة أنواع البيانات للمتغيرات في الفئة Guru99VariableMetaData.class
      5. طباعة جميع معدّلات الوصول للمتغيرات في الفئة Guru99VariableMetaData.class
      6. القيم المطبوعة لجميع المتغيرات في طباعة جميع أنواع البيانات للمتغيرات في الفئة Guru99VariableMetaData.class

      الحصول على البيانات الوصفية للطريقة

      الحصول على البيانات الوصفية للطريقة

      مثال 3: كيفية الحصول على البيانات الوصفية للطريقة

      تُظهر الأمثلة التالية كيفية الحصول على بيانات وصفية لطريقة ما:

      هنا، نقوم بإنشاء فئة تسمى Guru99MethodMetaData .class مع بعض الأساليب

      الحصول على البيانات الوصفية للطريقة

      package guru;		
      import java.sql.SQLException;		
      public class Guru99MethodMetaData {   				
      
      	public void guru99Add(int firstElement, int secondElement , String result) 									
          throws ClassNotFoundException, ClassCastException{			
                System.out.println("Demo method for Reflextion  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");					
          }	
      }

      خطوات الحصول على البيانات الوصفية حول الأساليب الموجودة في الفصل أعلاه:

      1. قم بإنشاء كائن فئة من الفئة أعلاه، أي Guru99MethodMetaData.class على النحو التالي:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. احصل على معلومات الطريقة في صفيف الطريقة باستخدام طريقة getMethods () وطريقة getDeclaredMethods () على النحو التالي:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        الحصول على الأساليب () تقوم الطريقة بإرجاع البيانات الوصفية للطرق العامة من الفئة المحددة وكذلك من فئتها الفائقة.

        getDeclaredMethods() تقوم الطريقة بإرجاع البيانات التعريفية لجميع الطرق من الفئة المحددة فقط.

      3. احصل على اسم الطريقة المستخدمة getName () الأسلوب.
      4. احصل على نوع الإرجاع للطريقة التي تستخدمها getReturnType() الأسلوب.
      5. احصل على معدّلات الوصول للطرق المستخدمة الحصول على المعدلات () و Modifiers.toString(int i) الأساليب.
      6. احصل على أنواع معلمات الطريقة باستخدام الحصول على المعلمة () الطريقة التي تقوم بإرجاع مجموعة فئة.
      7. الحصول على الاستثناء باستخدام getExceptionTypes() الطريقة التي تقوم بإرجاع مجموعة فئة.

      نحن هنا نكتب فصلًا للحصول على البيانات الوصفية للطرق الموجودة في الفصل Guru99MethodMetaData.class:

      الحصول على البيانات الوصفية للطريقة

      package guru;
      import java.lang.reflect.Method;
      import java.lang.reflect.Modifier;
      
      public class Guru99MethodMetaDataTest { 
      
      	public static void main (String[] args) {
      		// Create Class object for Guru99Method MetaData.class 
      		class guru99ClassObj = Guru99MethodMetaData.class;
      
      		// Get the metadata or information of all the methods of the class using getDeclaredMethods() 
      		Method[] guru99Methods=guru99classObj.getDeclaredMethods();
      
      		for(Method method : guru99Methods) { 
      		// Print the method names
      		System.out.println("Name of the method : "+method.getName());
      		
      		// Print return type of the methods 
      		System.out.println("Return type of the method : "+method.getReturnType());
      		
      		//Get the access modifier list and print
      		int guru99ModifierList = method.getModifiers(); 
      		System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
      		
      		// Get and print parameters of the methods 
      		Class[] guru99ParamList= method.getParameterTypes(); 
      		system.out.print ("Method parameter types : "); 
      		for (Class class1 : guru99ParamList){ 
      			System.out.println(class1.getName()+" ");
      		}
              System.out.println();
      		
      		// Get and print exception thrown by the method 
      		Class[] guru99ExceptionList = method. getExceptionTypes(); 
      		system.out.print("Excpetion thrown by method :"); 
      		for (Class class1 : guru99ExceptionList) {
      			System.out.println (class1.getName() +" "):
      		} 
      		System.Out.println(); 
      		system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
      		
      		}
       
      	}
      }
      
      1. تم إنشاء كائن فئة لـ Guru99MethodMetaData.class
      2. حصلت على جميع البيانات الوصفية لجميع الطرق في صفيف الطريقة
      3. تمت طباعة جميع أسماء الطرق الموجودة في الفصل Guru99MethodMetaData.class
      4. أنواع الإرجاع المطبوعة للطرق الموجودة في الفئة Guru99MethodMetaData.class
      5. تمت طباعة جميع معدّلات الوصول للطرق الموجودة في الفصل Guru99MethodMetaData.class
      6. أنواع المعلمات المطبوعة للطرق في Guru99MethodMetaData.class
      7. يتم طرح الاستثناءات المطبوعة بالطرق الموجودة في Guru99MethodMetaData.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; 
      public class Guru99ConstructorMetaDataTest {
      	
      	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) {
      			// Print all name of each constructor
      			System.out.println("Constrcutor name : "+constructor.getName());
      			
      			//Get and print access modifiers of each constructor 
      			int guru99Modifiers= constructor.getModifiers(); 
      			System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
      			
      			// Get and print parameter types 
      			Class[] guru99ParamList=constructor.getParameterTypes();
      			System.out.print ("Constrctor parameter types :"); 
      			for (Class class1 : guru99ParamList) { 
      				System.out.println(class1.getName() +" ");
      			}
      			System. out.println();
      
      			// Get and print exception thrown by constructors
      			Class[] guru99ExceptionList=constructor.getFxceptionTypes();
      			System.out.println("Exception thrown by constructors :"); 
      			for (Class class1 : guru99ExceptionList) { 
      				System.out.println(class1.getName() +" ");
      			} 
      			System.out.println();
      			System.out.println("*******************************************");
      		}
      	}
      }
      
      1. تم إنشاء كائن فئة لـ Guru99Constructor.class
      2. حصلت على جميع البيانات الوصفية لجميع المُنشئين في مصفوفة المُنشئ
      3. طباعة جميع أسماء المنشئ الموجودة في الفصل Guru99Constructor.class
      4. تمت طباعة جميع معدّلات الوصول الخاصة بالمنشئين في الفصل Guru99Constructor.class
      5. أنواع المعلمات المطبوعة للمنشئات في Guru99Constructor.class
      6. يتم طرح الاستثناءات المطبوعة بواسطة المُنشئين في Guru99Constructor.class

      الحصول على البيانات الوصفية للمنشئين

      الحصول على البيانات الوصفية للمنشئين

      ملخص

      • تساعد برمجة الانعكاس في لغة جافا في استرجاع وتعديل المعلومات حول الفئات وأعضاء الفصل مثل المتغيرات والطرق والمنشئات.
      • واجهة برمجة تطبيقات الانعكاس في Java يمكن تنفيذ ذلك باستخدام الفئات الموجودة في حزمة java.lang.reflect وطرق فئة java.lang.Class.
      • بعض الطرق الشائعة الاستخدام لفئة java.lang.Class هي getName ()، وgetSuperclass ()، وgetInterfaces ()، وgetModifiers () وما إلى ذلك.
      • بعض الفئات شائعة الاستخدام في الحزمة java.lang.reflect هي Field، وMethod، وConstructor، وModifier، وما إلى ذلك.
      • يمكن لـ Reflection API الوصول إلى الأساليب الخاصة والمتغيرات الخاصة بفئة ما والتي قد تشكل تهديدًا أمنيًا.
      • تعد واجهة برمجة تطبيقات Reflection إحدى الإمكانيات القوية التي توفرها Javaولكن هذا يأتي مع بعض النفقات العامة مثل الأداء الأبطأ، والثغرات الأمنية، ومشكلة الأذونات. وبالتالي، يجب التعامل مع واجهة برمجة التطبيقات العاكسة باعتبارها الملاذ الأخير لإجراء عملية.

    تلخيص هذه التدوينة بـ: