Что такое отражение в Java?
Отражение Java — это процесс анализа и изменения всех возможностей класса во время выполнения. Reflection API в Java используется для управления классом и его членами, которые включают поля, методы, конструктор и т. Д. Во время выполнения.
Одним из преимуществ API отражения в Java является то, что он также может манипулировать частными членами класса.
В пакете java.lang.reflect предусмотрено много классов для реализации отражения. Java.Methods класса java.lang.Class используется для сбора полных метаданных определенного класса.
В этом уроке вы узнаете
- Что такое отражение
- Класс в пакете java.lang.reflect
- Методы, используемые в java.lang.Class
- Как получить полную информацию о классе
- Пример 1: Как получить метаданные класса
- Пример 2: Как получить метаданные переменной
- Пример 3: Как получить метаданные метода
- Пример 4: Как получить метаданные конструкторов
Класс в пакете 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), который возвращает спецификатор доступа для данного класса.
Как получить полную информацию о классе
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 { }
- Название класса: Guru99Base
- Это модификаторы доступа: публичные и абстрактные
- В нем реализованы интерфейсы: Serializable и Cloneable.
- Поскольку он не расширил ни один класс явно, он является суперклассом: 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 Classguru99ClassObj = 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)); } }
- выведите имя класса, используя метод getName
- Напечатайте имя суперкласса, используя метод getSuperClass (). GetName ()
- Распечатать название реализованных интерфейсов
- Распечатайте модификаторы доступа, используемые классом
Пример 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"; }
-
Создайте объект класса вышеупомянутого класса, то есть Guru99VariableMetaData.class, как показано ниже:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Получите метаданные в виде массива полей, используя методы getFields () или getDeclaredFields (), как показано ниже:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Метод getFields () возвращает метаданные публичной переменной из указанного класса, а также из его суперкласса.
Метод getDeclaredFields () возвращает метаданные всех переменных только из указанного класса.
- Получить имя переменных, используя метод public String getName ().
- Получите тип данных переменных, используя метод public Class getType ().
-
Получить значение переменной, используя метод public xxx get (Field).
Здесь xxx может быть байтом или коротким значением любого типа, который мы хотим получить.
-
Получить модификаторы доступа к переменным, используя методы 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } }
- Создан объект класса для Guru99VariableMetaData.class
- Получил все метаданные переменных в массиве Field
- Напечатаны все имена переменных в классе Guru99VariableMetaData.class
- Напечатаны все типы данных переменных в классе Guru99VariableMetaData.class
- Напечатаны все модификаторы доступа переменных в классе Guru99VariableMetaData.class
- Печатные значения всех переменных в Печатные все типы данных переменных в классе Guru99VariableMetaData.class
-
Создайте объект класса вышеупомянутого класса, то есть Guru99MethodMetaData.class, как показано ниже:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Получите информацию о методе в массиве Method, используя методы getMethods () и getDeclaredMethods (), как показано ниже:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Метод getMethods () возвращает метаданные открытых методов из указанного класса, а также из его суперкласса.
Метод getDeclaredMethods () возвращает метаданные всех методов только из указанного класса.
- Получить имя метода, используя метод getName () .
- Получите тип возврата метода, используя метод getReturnType () .
- Получите модификаторы доступа методов, используя методы getModifiers () и Modifiers.toString (int i) .
- Получить типы параметров метода, используя метод getParameterTypes (), который возвращает массив классов.
-
Получить выброшенное исключение с помощью метода getExceptionTypes (), который возвращает массив классов.
- Создан объект класса для Guru99MethodMetaData.class
- Получил все метаданные всех методов в массиве Method
- Напечатаны все имена методов, присутствующие в классе Guru99MethodMetaData.class
- Печатные возвращаемые типы методов в классе Guru99MethodMetaData.class
- Напечатаны все модификаторы доступа методов в классе Guru99MethodMetaData.class
- Напечатанные типы параметров методов в Guru99MethodMetaData.class
-
Печатные исключения генерируются методами в Guru99MethodMetaData.class
- Created class object for Guru99Constructor.class
- Got all the metadata of all the constructors in a Constructor array
- Printed all the constructor’s names present in the class Guru99Constructor.class
- Printed all the access modifiers of the constructors in the class Guru99Constructor.class
- Printed parameter types of the constructors in Guru99Constructor.class
- Printed exceptions are thrown by constructors in Guru99Constructor.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"); } }
Шаги, чтобы получить метаданные о методах в вышеупомянутом классе:
Здесь мы пишем класс для получения метаданных методов, присутствующих в классе 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } }
Пример 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("*******************************************"); } } }
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 отражения следует рассматривать как последнее средство для выполнения операции.