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

Содержание:

Anonim

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

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

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

Пакет java.lang.reflect предоставляет множество классов для реализации отражения java. Методы класса 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 () : возвращает ссылку на суперкласс
  • Public Class [] getInterfaces () : возвращает массив интерфейсов, реализованных указанным классом.
  • Public в getModifiers (): возвращает целочисленное значение, представляющее модификаторы указанного класса, которые необходимо передать в качестве параметра методу « public static String toString (int i)», который возвращает спецификатор доступа для данного класса.

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

Чтобы получить информацию о переменных, методах и конструкторах класса, нам нужно создать объект класса.
public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
  • В следующем примере показаны различные способы создания объекта класса "class":
  • Пример 1: Как получить метаданные класса

    В следующем примере показано, как получить такие метаданные, как: имя класса, имя суперкласса, реализованные интерфейсы и модификаторы доступа класса.

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

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Имя класса: Guru99Base
    2. Модификаторы доступа: общедоступные и абстрактные.
    3. В нем реализованы интерфейсы: Serializable и Cloneable.
    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.classClass  guru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.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() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.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 classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.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 () или 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.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(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. Получите информацию о методе в массиве 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:

      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.classclass 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 namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] 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 methodClass[] 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

      Пример 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.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] 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 constructorsClass[] 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. Получены все метаданные всех конструкторов в массиве Constructor
      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: Поле, Метод, Конструктор, Модификатор и т. Д.
      • API Reflection может получить доступ к закрытым методам и переменным класса, что может быть угрозой безопасности.
      • Reflection API - это мощная возможность, предоставляемая Java, но она сопряжена с некоторыми накладными расходами, такими как более низкая производительность, уязвимость системы безопасности и проблема с разрешениями. Следовательно, API отражения следует рассматривать как последнее средство выполнения операции.