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

Что такое рефлексия в Java?

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

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

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

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

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

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

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

  • Открытая строка getName (): Возвращает имя класса.
  • публичный класс getSuperclass(): Возвращает ссылку на суперкласс.
  • Публичный класс[] getInterfaces() : Возвращает массив интерфейсов, реализованных указанным классом.
  • Публичный в getModifiers(): Возвращает целочисленное значение, представляющее модификаторы указанного класса, которое необходимо передать в качестве параметра функции «общедоступная статическая строка toString (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. Получите метаданные в виде массива полей, используя getFields () or 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:

      Получить метаданные переменной

      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. Получите тип возвращаемого значения метода, используя получить тип возврата () метод.
      5. Получите модификаторы доступа к методам, используя getModifiers () и Modifiers.toString(int i) методы.
      6. Получить типы параметров метода, используя getParameterTypes () метод, который возвращает массив классов.
      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 помогает получать и изменять информацию о классах и членах классов, таких как переменные, методы, конструкторы.
      • API отражения в Java может быть реализовано с использованием классов в пакете java.lang.reflect и методов класса java.lang.Class.
      • Некоторые часто используемые методы класса java.lang.Class: getName(), getSuperclass(), getInterfaces(), getModifiers() и т.д.
      • Некоторые часто используемые классы в пакете java.lang.reflect — это Field, Method, Constructor, Modifier и т. д.
      • API Reflection может получать доступ к частным методам и переменным класса, что может представлять угрозу безопасности.
      • Reflection API — это мощная возможность, предоставляемая Java, но это сопряжено с некоторыми издержками, такими как более низкая производительность, уязвимость безопасности и проблема с разрешениями. Поэтому API отражения следует рассматривать как последнее средство для выполнения операции.