Co to jest odbicie w Javie?
Java Reflection to proces analizowania i modyfikowania wszystkich możliwości klasy w czasie wykonywania. Reflection API w Javie służy do manipulowania klasą i jej elementami składowymi, które obejmują pola, metody, konstruktor itp. W czasie wykonywania.
Jedną z zalet API odbicia w Javie jest to, że może on również manipulować prywatnymi członkami klasy.
Pakiet java.lang.reflect udostępnia wiele klas do implementacji odbicia java.Methods klasy java.lang.Class służy do gromadzenia pełnych metadanych określonej klasy.
W tym samouczku nauczysz się:
- Co to jest odbicie
- Klasa w pakiecie java.lang.reflect
- Metody używane w java.lang.Class
- Jak uzyskać pełne informacje o zajęciach
- Przykład 1: Jak uzyskać metadane klasy
- Przykład 2: Jak uzyskać metadane zmiennej
- Przykład 3: Jak uzyskać metadane metody
- Przykład 4: Jak uzyskać metadane konstruktorów
Klasa w pakiecie java.lang.reflect
Poniżej znajduje się lista różnych klas Java w java.lang.package do zaimplementowania refleksji-
- Pole : ta klasa jest używana 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 deklaratywnych informacji, takich jak modyfikator dostępu, nazwa i typy parametrów konstruktora.
- Modyfikator : ta klasa służy do zbierania informacji o określonym modyfikatorze dostępu.
Metody używane w java.lang.Class
- Public String getName () : Zwraca nazwę klasy.
- public Class getSuperclass () : Zwraca odwołanie do superklasy
- Klasa publiczna [] getInterfaces () : zwraca tablicę interfejsów implementowanych przez określoną klasę
- Public w getModifiers (): Zwraca wartość całkowitą reprezentującą modyfikatory określonej klasy, która musi zostać przekazana 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 zajęciach
Aby uzyskać informacje o zmiennych, metodach i konstruktorach klasy, musimy utworzyć obiekt tej klasy.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;}}
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 do klasy.
Otrzymamy metadane poniższej klasy o nazwie Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Nazwa klasy to: Guru99Base
- Modyfikatory dostępu to: publiczne i abstrakcyjne
- Posiada zaimplementowane interfejsy: Serializable i Cloneable
- Ponieważ nie rozszerzył jawnie żadnej klasy, jej nadrzędną klasą jest: 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));}}
- wypisuje nazwę klasy używając metody getName
- Wydrukuj nazwę superklasy za pomocą metody getSuperClass (). GetName ()
- Wydrukuj nazwę zaimplementowanych interfejsów
- Wydrukuj modyfikatory dostępu używane przez klasę
Przykład 2: Jak uzyskać metadane zmiennej
Poniższe przykłady pokazują, jak uzyskać 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, czyli Guru99VariableMetaData.class, jak poniżej:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Pobierz metadane w postaci tablicy pól za pomocą metod getFields () lub getDeclaredFields () jak poniżej:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Metoda getFields () zwraca metadane zmiennej publicznej z określonej klasy, jak również z jej superklasy .
Metoda getDeclaredFields () zwraca metadane wszystkich zmiennych tylko z określonej klasy.
- Uzyskaj nazwę zmiennych za pomocą metody „public String getName ()”.
- Pobierz typ danych zmiennych za pomocą metody „public Class getType ()”.
- Uzyskaj wartość zmiennej za pomocą metody „public xxx get (Field)”.
Tutaj xxx może oznaczać bajt lub skrót dowolnego typu wartości, który chcemy pobrać.
- Uzyskaj modyfikatory dostępu do zmiennych za pomocą metod getModifier () i Modifier.toString (int i).
Tutaj piszemy klasę, aby uzyskać metadane zmiennych obecnych w klasie 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Utworzono obiekt klasy dla Guru99VariableMetaData.class
- Uzyskano wszystkie metadane zmiennych w tablicy Field
- Wydrukowano wszystkie nazwy zmiennych w klasie Guru99VariableMetaData.class
- Wydrukowano wszystkie typy danych zmiennych w klasie Guru99VariableMetaData.class
- Wydrukowano wszystkie modyfikatory dostępu do zmiennych w klasie Guru99VariableMetaData.class
- Wydrukowano wartości wszystkich zmiennych w Wydrukowano wszystkie typy danych zmiennych z klasy Guru99VariableMetaData.class
- Utwórz obiekt klasy powyższej klasy, czyli Guru99MethodMetaData.class, jak poniżej:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Pobierz informacje o metodzie w tablicy Method za pomocą metody getMethods () i getDeclaredMethods (), jak poniżej:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Metoda getMethods () zwraca metadane metod publicznych z określonej klasy, jak również z jej superklasy.
Metoda getDeclaredMethods () zwraca metadane wszystkich metod tylko z określonej klasy.
- Uzyskaj nazwę metody za pomocą metody getName () .
- Pobierz zwracany typ metody za pomocą metody getReturnType () .
- Uzyskaj modyfikatory dostępu do metod przy użyciu metod getModifiers () i Modifiers.toString (int i) .
- Pobierz typy parametrów metody za pomocą metody getParameterTypes () , która zwraca tablicę klas.
- Uzyskaj zgłoszony wyjątek za pomocą metody getExceptionTypes () , która zwraca tablicę klas.
- Utworzono obiekt klasy dla Guru99MethodMetaData.class
- Uzyskano wszystkie metadane wszystkich metod w tablicy Method
- Wydrukowano wszystkie nazwy metod występujące w klasie Guru99MethodMetaData.class
- Wydrukowane zwracane typy metod w klasie Guru99MethodMetaData.class
- Wydrukowano wszystkie modyfikatory dostępu do metod w klasie Guru99MethodMetaData.class
- Wydrukowane typy parametrów metod w Guru99MethodMetaData.class
- Wydrukowane wyjątki są generowane przez metody w Guru99MethodMetaData.class
- Utworzono obiekt klasy dla Guru99Constructor.class
- Uzyskano wszystkie metadane wszystkich konstruktorów w tablicy Constructor
- Wydrukowano wszystkie nazwy konstruktorów obecne w klasie Guru99Constructor.class
- Wydrukowano wszystkie modyfikatory dostępu konstruktorów w klasie Guru99Constructor.class
- Wydrukowane typy parametrów konstruktorów w Guru99Constructor.class
- Wydrukowane wyjątki są generowane przez konstruktorów w Guru99Constructor.class
- Programowanie refleksyjne w Javie pomaga w pobieraniu i modyfikowaniu informacji o klasach i składowych klas, takich jak zmienne, metody, konstruktory.
- Reflection API w Javie można zaimplementować za pomocą klas z pakietu java.lang.reflect oraz metod klasy java.lang.Class.
- Niektóre powszechnie używane metody klasy java.lang.Class to getName (), getSuperclass (), getInterfaces (), getModifiers () itp.
- Niektóre powszechnie używane klasy w pakiecie java.lang.reflect to Field, Method, Constructor, Modifier itp.
- Reflection API może uzyskać dostęp do prywatnych metod i zmiennych klasy, które mogą stanowić zagrożenie dla bezpieczeństwa.
- Reflection API to potężna funkcja zapewniana przez Javę, ale wiąże się z pewnymi kosztami, takimi jak wolniejsza wydajność, luka w zabezpieczeniach i problem z uprawnieniami. Stąd odbicie API powinno być traktowane jako ostatnia deska ratunku do wykonania operacji.
Przykład 3: Jak uzyskać metadane metody
Poniższe przykłady pokazują, 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 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");}}
Kroki, aby uzyskać metadane dotyczące metod w powyższej klasie:
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 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Przykład 4: Jak uzyskać metadane konstruktorów
Poniższe przykłady pokazują, 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;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("*******************************************");}}}
Podsumowanie: