Що таке відображення в 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
- Відкритий рядок getName () : Повертає ім'я класу.
- public Class getSuperclass () : Повертає посилання на супер клас
- Відкритий клас [] getInterfaces () : Повертає масив інтерфейсів, реалізованих зазначеним класом
- Відкритий у 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;}}
Приклад 1: Як отримати метадані класу
Наступний приклад показує, як отримати такі метадані, як: Назва класу, ім'я суперкласу, реалізовані інтерфейси та модифікатори доступу класу.
Ми отримаємо метадані нижчого класу з назвою Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Назва класу: Guru99Base
- Це модифікатори доступу: загальнодоступні та абстрактні
- Він реалізував інтерфейси: серіалізований та клонуючий
- Оскільки він не розширив жодного класу явно, це супер клас: java.lang.Object
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = 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));}}
- вивести назву класу за допомогою методу 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Створено об'єкт класу для 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
- Створено об'єкт класу для Guru99Constructor.class
- Отримав усі метадані всіх конструкторів у масиві конструктора
- Надруковано всі імена конструктора, присутні в класі Guru99Constructor.class
- Надруковано всі модифікатори доступу конструкторів у класі Guru99Constructor.class
- Надруковані типи параметрів конструкторів у Guru99Constructor.class
- Друковані винятки створюють конструктори в 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 відображення слід розглядати як крайній засіб виконання операції.
Приклад 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Приклад 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("*******************************************");}}}
Короткий зміст: