Учебники

50) Учебные руководства по Java Reflection API

Что такое отражение в Java?

Отражение Java — это процесс анализа и изменения всех возможностей класса во время выполнения. Reflection API в Java используется для управления классом и его членами, которые включают поля, методы, конструктор и т. Д. Во время выполнения.

Одним из преимуществ API отражения в Java является то, что он также может манипулировать частными членами класса.

В пакете java.lang.reflect предусмотрено много классов для реализации отражения. Java.Methods класса java.lang.Class используется для сбора полных метаданных определенного класса.

В этом уроке вы узнаете

Класс в пакете java.lang.reflect

Ниже приведен список различных классов Java в java.lang.package для реализации

  • Поле : Этот класс используется для сбора декларативной информации, такой как тип данных, модификатор доступа, имя и значение переменной.
  • Метод : этот класс используется для сбора декларативной информации, такой как модификатор доступа, тип возвращаемого значения, имя, типы параметров и тип исключения метода.
  • Конструктор : Этот класс используется для сбора декларативной информации, такой как модификатор доступа, имя и типы параметров конструктора.
  • Модификатор : этот класс используется для сбора информации о конкретном модификаторе доступа.

Методы, используемые в java.lang.Class

  • Public String getName () : возвращает имя класса.
  • public Class getSuperclass () : возвращает ссылку на супер класс
  • Открытый класс [] getInterfaces () : возвращает массив интерфейсов, реализованных указанным классом.
  • Public in getModifiers (): возвращает целочисленное значение, представляющее модификаторы указанного класса, которые необходимо передать в качестве параметра методу public static String toString (int i), который возвращает спецификатор доступа для данного класса.

Как получить полную информацию о классе

Чтобы получить информацию о переменных, методах и конструкторах класса, нам нужно создать объект класса.

Java Reflection API - Учебное пособие

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:

    Java Reflection API - Учебное пособие

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Название класса: Guru99Base
    2. Это модификаторы доступа: публичные и абстрактные
    3. В нем реализованы интерфейсы: Serializable и Cloneable.
    4. Поскольку он не расширил ни один класс явно, он является суперклассом: java.lang.Object

    Ниже класс получит метаданные Guru99Base.class и распечатает его:

    Java Reflection API - Учебное пособие

    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. Распечатайте модификаторы доступа, используемые классом

    Java Reflection API - Учебное пособие

    Java Reflection API - Учебное пособие

    Пример 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. Получите метаданные в виде массива полей, используя методы getFields () или getDeclaredFields (), как показано ниже:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    Метод getFields () возвращает метаданные публичной переменной из указанного класса, а также из его суперкласса.

    Метод getDeclaredFields () возвращает метаданные всех переменных только из указанного класса.

    1. Получить имя переменных, используя метод public String getName ().
    2. Получите тип данных переменных, используя метод public Class getType ().
    3. Получить значение переменной, используя метод public xxx get (Field).

      Здесь xxx может быть байтом или коротким значением любого типа, который мы хотим получить.

    4. Получить модификаторы доступа к переменным, используя методы getModifier () и Modifier.toString (int i).

      Здесь мы пишем класс для получения метаданных переменных, присутствующих в классе Guru99VariableMetaData .class:

      Java Reflection API - Учебное пособие

      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. Получил все метаданные переменных в массиве Field
      3. Напечатаны все имена переменных в классе Guru99VariableMetaData.class
      4. Напечатаны все типы данных переменных в классе Guru99VariableMetaData.class
      5. Напечатаны все модификаторы доступа переменных в классе Guru99VariableMetaData.class
      6. Печатные значения всех переменных в Печатные все типы данных переменных в классе Guru99VariableMetaData.class

      Java Reflection API - Учебное пособиеJava Reflection API - Учебное пособие

      Пример 3: Как получить метаданные метода

      Следующие примеры показывают, как получить метаданные метода:

      Здесь мы создаем класс с именем Guru99MethodMetaData .class с некоторыми методами

      Java Reflection API - Учебное пособие

      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. Получите информацию о методе в массиве Method, используя методы getMethods () и getDeclaredMethods (), как показано ниже:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        Метод getMethods () возвращает метаданные открытых методов из указанного класса, а также из его суперкласса.

        Метод getDeclaredMethods () возвращает метаданные всех методов только из указанного класса.

      3. Получить имя метода, используя метод getName () .
      4. Получите тип возврата метода, используя метод getReturnType () .
      5. Получите модификаторы доступа методов, используя методы getModifiers () и Modifiers.toString (int i) .
      6. Получить типы параметров метода, используя метод getParameterTypes (), который возвращает массив классов.
      7. Получить выброшенное исключение с помощью метода getExceptionTypes (), который возвращает массив классов.

      Здесь мы пишем класс для получения метаданных методов, присутствующих в классе Guru99MethodMetaData.class:

      Java Reflection API - Учебное пособие

      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. Получил все метаданные всех методов в массиве Method
      3. Напечатаны все имена методов, присутствующие в классе Guru99MethodMetaData.class
      4. Печатные возвращаемые типы методов в классе Guru99MethodMetaData.class
      5. Напечатаны все модификаторы доступа методов в классе Guru99MethodMetaData.class
      6. Напечатанные типы параметров методов в Guru99MethodMetaData.class
      7. Печатные исключения генерируются методами в Guru99MethodMetaData.class

        Java Reflection API - Учебное пособие

      Java Reflection API - Учебное пособие

      Пример 4: Как получить метаданные конструкторов

      Следующие примеры показывают, как получить метаданные конструкторов:

      Здесь мы создаем класс с именем Guru99Constructor.class с различными конструкторами:

      Java Reflection API - Учебное пособие

      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:

      Java Reflection API - Учебное пособие

      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. Created class object for Guru99Constructor.class
      2. Got all the metadata of all the constructors in a Constructor array
      3. Printed all the constructor’s names present in the class Guru99Constructor.class
      4. Printed all the access modifiers of the constructors in the class Guru99Constructor.class
      5. Printed parameter types of the constructors in Guru99Constructor.class
      6. Printed exceptions are thrown by constructors in Guru99Constructor.class

      Java Reflection API - Учебное пособие

      Java Reflection API - Учебное пособие

      Summary:

    • Reflection programming in java helps in retrieving and modifying information about Classes and Class members such variable, methods, constructors.
    • Reflection API in Java can be implemented using classes in java.lang.reflect package and methods of java.lang.Class class.
    • Some commonly used methods of java.lang.Class class are getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
    • Некоторые часто используемые классы в пакете java.lang.reflect: Поле, Метод, Конструктор, Модификатор и т. Д.
    • Reflection API может обращаться к закрытым методам и переменным класса, которые могут представлять угрозу безопасности.
    • Reflection API — это мощная возможность, предоставляемая Java, но она сопряжена с некоторыми накладными расходами, такими как снижение производительности, уязвимость безопасности и проблема с разрешениями. Следовательно, API отражения следует рассматривать как последнее средство для выполнения операции.