Java Samouczek API Reflection z przykładem
⚡ Inteligentne podsumowanie
Java Interfejs API Reflection analizuje i modyfikuje możliwości klasy w czasie wykonywania, w tym jej pola, metody i konstruktory. W tym materiale wyjaśniono pakiet java.lang.reflect, kluczowe metody klasy java.lang.Class oraz cztery przykłady odczytu metadanych klasy, zmiennej, metody i konstruktora.

W czym jest odbicie Java?
Java Refleksja to proces analizowania i modyfikowania wszystkich możliwości klasy w czasie wykonywania. API Refleksji w Java służy do manipulowania klasą i jej elementami, do których zaliczają się pola, metody, konstruktory itp. w czasie wykonywania.
Jedną z zalet interfejsu API Reflection jest Java polega na tym, że może manipulować także prywatnymi członkami klasy.
Pakiet java.lang.reflect zawiera wiele klas do implementacji refleksji. Metody klasy java.lang.Class służą do gromadzenia kompletnych metadanych danej klasy.
Klasa w pakiecie java.lang.reflect
Poniżej znajduje się lista różnorodny Java Klasy w pakiecie java.lang.reflect w celu zaimplementowania refleksji:
- Pole: Ta klasa służy do zbierania informacji deklaratywnych, takich jak typ danych, modyfikator dostępu, nazwa i wartość zmiennej.
- Metoda: Ta klasa służy do zbierania informacji deklaratywnych, takich jak modyfikator dostępu, typ zwracany, nazwa, typy parametrów i typ wyjątku metody.
- Konstruktor: Ta klasa służy do zbierania informacji deklaratywnych, takich jak modyfikator dostępu, nazwa i typy parametrów konstruktora.
- Edytować: Ta klasa służy do zbierania informacji o konkretnym modyfikatorze dostępu.
Metody stosowane w java.lang.Class
- publiczny String getName(): Zwraca nazwę klasy.
- publiczna Klasa getSuperclass(): Zwraca odwołanie do superklasy.
- publiczna Klasa[] getInterfaces(): Zwraca tablicę interfejsów zaimplementowanych przez określoną klasę.
- publiczna int getModifiers(): Zwraca wartość całkowitą reprezentującą modyfikatory określonej klasy, którą należy przekazać jako parametr do metody „public static String toString(int i)”, która zwraca specyfikator dostępu dla danej klasy.
Jak uzyskać pełne informacje o klasie
Aby uzyskać informacje o zmienne, metod i konstruktorów klasy, musimy utworzyć obiekt tej klasy. Poniższy przykład pokazuje różne sposoby tworzenia obiektu klasy „Klasa”:
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; } }
Przykład 1: Jak uzyskać metadane klasy
Poniższy przykład pokazuje, jak uzyskać metadane, takie jak nazwa klasy, nazwa superklasy, zaimplementowane interfejsy i modyfikatory dostępu klasy.
Otrzymamy metadane klasy poniżej o nazwie Guru99Klasa bazowa:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- Nazwa klasy to: Guru99Baza
- Jego modyfikatory dostępu to: public i abstract
- Posiada zaimplementowane interfejsy: Serializable i Cloneable
- Ponieważ nie rozszerzyła jawnie żadnej klasy, jej superklasą jest: java.lang.Object
Poniższa klasa otrzyma metadane Guru99Base.class i wydrukuj ją:
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)); } }
- Wyświetl nazwę klasy za pomocą metody getName().
- Wyświetl nazwę superklasy za pomocą metody getSuperclass().getName().
- Wyświetl nazwy zaimplementowanych interfejsów.
- Wyświetl modyfikatory dostępu używane przez klasę.
Przykład 2: Jak uzyskać metadane zmiennej
Poniższy przykład pokazuje, jak pobrać metadane zmiennej.
Tutaj tworzymy klasę o nazwie Guru99VariableMetaData.class z kilkoma zmiennymi:
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"; }
Kroki, aby uzyskać metadane dotyczące zmiennych w powyższej klasie:
- Utwórz obiekt klasy powyższej klasy, tj. Guru99VariableMetaData.class, jak poniżej:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Uzyskaj metadane w formie tablicy pól za pomocą getFields() or getDeclaredFields() metody jak poniżej:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
getFields() Metoda zwraca metadane zmiennych publicznych ze wskazanej klasy oraz z jej superklasy.
getDeclaredFields() Metoda zwraca metadane wszystkich zmiennych tylko z określonej klasy.
- Pobierz nazwę zmiennej za pomocą metody „public String getName()”.
- Pobierz typ danych zmiennych za pomocą metody „public Class getType()”.
- Pobierz wartość zmiennej za pomocą metody „public xxx get(Field)”. W tym przypadku xxx może być wartością typu byte, short lub dowolnym innym typem wartości, którą chcemy pobrać.
- Pobierz modyfikatory dostępu do zmiennych za pomocą metod getModifiers() i Modifier.toString(int i).
Tutaj piszemy klasę, aby uzyskać metadane zmiennych obecnych w klasie Guru99VariableMetaData.class:
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(); } } }
- Utworzono obiekt klasy dla Guru99VariableMetaData.class.
- Pobrano wszystkie metadane zmiennych w tablicy pól.
- Wydrukowano wszystkie nazwy zmiennych w klasie Guru99VariableMetaData.class.
- Wydrukowano wszystkie typy danych zmiennych w klasie.
- Wyświetlono wszystkie modyfikatory dostępu do zmiennych w klasie.
- Wyświetlono wartości wszystkich zmiennych w klasie.
Przykład 3: Jak uzyskać metadane metody
Poniższy przykład pokazuje, jak uzyskać metadane metody.
Tutaj tworzymy klasę o nazwie Guru99MethodMetaData.class z kilkoma metodami:
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"); } }
Kroki umożliwiające uzyskanie metadanych dotyczących metod w powyższej klasie:
- Utwórz obiekt klasy powyższej klasy, tj. Guru99MethodMetaData.class, jak poniżej:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Pobierz informacje o metodach z tablicy metod, używając metod getMethods() i getDeclaredMethods(), jak pokazano poniżej:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
getMethods() Metoda zwraca metadane metod publicznych z określonej klasy, jak również z jej superklasy. getDeclaredMethods() Metoda zwraca metadane wszystkich metod tylko z określonej klasy.
- Uzyskaj nazwę metody za pomocą getName () Metoda.
- Uzyskaj typ zwracany przez metodę za pomocą getReturnType() Metoda.
- Uzyskaj modyfikatory dostępu do metod za pomocą getModifiers() oraz Modifier.toString(int i) Metody.
- Pobierz typy parametrów metody za pomocą getParameterTypes() metoda, która zwraca tablicę klas.
- Uzyskaj zgłoszone wyjątki za pomocą getExceptionTypes() metoda, która zwraca tablicę klas.
Tutaj piszemy klasę, aby uzyskać metadane metod obecnych w klasie 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 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(); } } }
- Utworzono obiekt klasy dla Guru99MetodaMetaData.class.
- Pobrano wszystkie metadane wszystkich metod w tablicy metod.
- Wyświetlono wszystkie nazwy metod obecne w klasie.
- Wyświetlono typy zwracane przez metody w klasie.
- Wyświetlono wszystkie modyfikatory dostępu metod w klasie.
- Wyświetlono typy parametrów metod.
- Wyświetlono wyjątki zgłoszone przez metody.
Przykład 4: Jak uzyskać metadane konstruktorów
Poniższy przykład pokazuje, jak uzyskać metadane konstruktorów.
Tutaj tworzymy klasę o nazwie Guru99Constructor.class z różnymi konstruktorami:
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 { } }
Tutaj piszemy klasę, aby uzyskać metadane konstruktorów obecnych w klasie Guru99Constructor.class:
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(); } } }
- Utworzono obiekt klasy dla Guru99Konstruktor.klasa.
- Pobrano wszystkie metadane wszystkich konstruktorów w tablicy konstruktorów.
- Wyświetlono nazwy wszystkich konstruktorów obecnych w klasie.
- Wyświetlono wszystkie modyfikatory dostępu konstruktorów w klasie.
- Wyświetlono typy parametrów konstruktorów.
- Wyświetlono wyjątki zgłoszone przez konstruktory.
















