Java Посібник Reflection API із прикладом
⚡ Розумний підсумок
Java API відображення аналізує та змінює можливості класу під час виконання, включаючи його поля, методи та конструктори. У цьому ресурсі пояснюється пакет java.lang.reflect, ключові методи java.lang.Class та чотири приклади, які зчитують метадані класу, змінної, методу та конструктора.
У чому Рефлексія Java?
Java Рефлексія — це процес аналізу та модифікації всіх можливостей класу під час виконання. API рефлексії в Java використовується для маніпулювання класом та його членами, включаючи поля, методи, конструктори тощо, під час виконання.
Одна з переваг Reflection API у Java полягає в тому, що він також може маніпулювати закритими членами класу.
Пакет java.lang.reflect надає багато класів для реалізації рефлексії. Методи класу java.lang.Class використовуються для збору повних метаданих певного класу.
Клас у пакеті java.lang.reflect
Нижче наведено список різний Java класів у пакеті java.lang.reflect для реалізації відображення:
- Поле: Цей клас використовується для збору декларативної інформації, такої як тип даних, модифікатор доступу, ім'я та значення змінної.
- Метод: Цей клас використовується для збору декларативної інформації, такої як модифікатор доступу, тип повернення, ім'я, типи параметрів та тип винятку методу.
- Конструктор: Цей клас використовується для збору декларативної інформації, такої як модифікатор доступу, ім'я та типи параметрів конструктора.
- Модифікатор: Цей клас використовується для збору інформації про певний модифікатор доступу.
Методи, що використовуються в java.lang.Class
- публічний рядок getName(): Повертає назву класу.
- публічний клас 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() 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
- Його модифікатори доступу: public та abstract
- Він має реалізовані інтерфейси: 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 Class<Guru99Base> 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 using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- Виведіть назву класу за допомогою методу getName().
- Виведіть назву суперкласу за допомогою методу getSuperclass().getName().
- Виведіть назви реалізованих інтерфейсів.
- Виведіть модифікатори доступу, що використовуються класом.
Приклад 2: Як отримати метадані змінної
У наступному прикладі показано, як отримати метадані змінної.
Тут ми створюємо клас з назвою GuruКлас 99VariableMetaData.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() or getDeclaredFields() методи, як показано нижче:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
Команда getFields() Метод повертає метадані публічних змінних із зазначеного класу, а також із його суперкласу.
Команда getDeclaredFields() Метод повертає метадані всіх змінних лише з вказаного класу.
- Отримайте назви змінних за допомогою методу «public String getName()».
- Отримайте тип даних змінних за допомогою методу "public Class getType()".
- Отримайте значення змінної за допомогою методу «public xxx get(Field)». Тут xxx може бути байтом, коротким значенням або будь-яким типом значення, яке ми хочемо отримати.
- Отримайте модифікатори доступу змінних за допомогою методів getModifiers() та Modifier.toString(int i).
Тут ми пишемо клас для отримання метаданих змінних, присутніх у класі. Guru99VariableMetaData.клас:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; 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 Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- Створено об'єкт класу для Guru99VariableMetaData.class.
- Отримано всі метадані змінних у масиві Field.
- Виведено всі назви змінних у класі Guru99VariableMetaData.class.
- Виведено всі типи даних змінних у класі.
- Виведено всі модифікатори доступу змінних у класі.
- Виведено значення всіх змінних у класі.
Приклад 3: Як отримати метадані методу
У наступному прикладі показано, як отримати метадані методу.
Тут ми створюємо клас з назвою GuruКлас 99MethodMetaData.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 Reflection 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, як показано нижче:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Отримайте інформацію про метод у масиві методів за допомогою методів getMethods() та getDeclaredMethods(), як показано нижче:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
Команда getMethods() Метод повертає метадані публічних методів із зазначеного класу, а також із його суперкласу. getDeclaredMethods() Метод повертає метадані всіх методів лише з вказаного класу.
- Отримайте назву методу за допомогою getName () метод.
- Отримайте тип повернення методу за допомогою getReturnType() метод.
- Отримайте модифікатори доступу до методів за допомогою getModifiers() та Modifier.toString(int i) методи
- Отримати типи параметрів методу за допомогою getParameterTypes() метод, який повертає масив класів.
- Отримуйте викиди винятків за допомогою getExceptionTypes() метод, який повертає масив класів.
Тут ми пишемо клас для отримання метаданих методів, присутніх у класі. Guru99MethodMetaData.клас:
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 Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Створено об'єкт класу для Guru99MethodMetaData.клас.
- Отримано всі метадані всіх методів у масиві методів.
- Виведено всі назви методів, присутні в класі.
- Виведено типи повернень методів класу.
- Виведено всі модифікатори доступу методів класу.
- Виведено типи параметрів методів.
- Виведено винятки, що викликані методами.
Приклад 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 { } }
Тут ми пишемо клас для отримання метаданих конструкторів, присутніх у класі. Guru99Конструктор.клас:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; 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) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Створено об'єкт класу для Guru99Конструктор.клас.
- Отримано всі метадані всіх конструкторів у масиві Constructor.
- Виведено імена всіх конструкторів, присутніх у класі.
- Виведено всі модифікатори доступу конструкторів у класі.
- Виведено типи параметрів конструкторів.
- Виведено винятки, що викинуті конструкторами.

















