Samouczek Java Reflection API z przykładem

Spisie treści:

Anonim

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;}}
  • Poniższy przykład pokazuje różne sposoby tworzenia obiektu klasy „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 {}
    1. Nazwa klasy to: Guru99Base
    2. Modyfikatory dostępu to: publiczne i abstrakcyjne
    3. Posiada zaimplementowane interfejsy: Serializable i Cloneable
    4. Ponieważ nie rozszerzył jawnie żadnej klasy, jej nadrzędną klasą jest: java.lang.Object
    Poniższa klasa otrzyma metadane Guru99Base.class i wydrukuje je:
    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. wypisuje nazwę klasy używając metody getName
    2. Wydrukuj nazwę superklasy za pomocą metody getSuperClass (). GetName ()
    3. Wydrukuj nazwę zaimplementowanych interfejsów
    4. 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:
    1. Utwórz obiekt klasy powyższej klasy, czyli Guru99VariableMetaData.class, jak poniżej:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. 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.

    1. Uzyskaj nazwę zmiennych za pomocą metody „public String getName ()”.
    2. Pobierz typ danych zmiennych za pomocą metody „public Class getType ()”.
    3. 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ć.

    4. 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Utworzono obiekt klasy dla Guru99VariableMetaData.class
      2. Uzyskano wszystkie metadane zmiennych w tablicy Field
      3. Wydrukowano wszystkie nazwy zmiennych w klasie Guru99VariableMetaData.class
      4. Wydrukowano wszystkie typy danych zmiennych w klasie Guru99VariableMetaData.class
      5. Wydrukowano wszystkie modyfikatory dostępu do zmiennych w klasie Guru99VariableMetaData.class
      6. Wydrukowano wartości wszystkich zmiennych w Wydrukowano wszystkie typy danych zmiennych z klasy Guru99VariableMetaData.class

      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:

      1. Utwórz obiekt klasy powyższej klasy, czyli Guru99MethodMetaData.class, jak poniżej:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. 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.

      3. Uzyskaj nazwę metody za pomocą metody getName () .
      4. Pobierz zwracany typ metody za pomocą metody getReturnType () .
      5. Uzyskaj modyfikatory dostępu do metod przy użyciu metod getModifiers () i Modifiers.toString (int i) .
      6. Pobierz typy parametrów metody za pomocą metody getParameterTypes () , która zwraca tablicę klas.
      7. Uzyskaj zgłoszony wyjątek za pomocą metody getExceptionTypes () , 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 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. Utworzono obiekt klasy dla Guru99MethodMetaData.class
      2. Uzyskano wszystkie metadane wszystkich metod w tablicy Method
      3. Wydrukowano wszystkie nazwy metod występujące w klasie Guru99MethodMetaData.class
      4. Wydrukowane zwracane typy metod w klasie Guru99MethodMetaData.class
      5. Wydrukowano wszystkie modyfikatory dostępu do metod w klasie Guru99MethodMetaData.class
      6. Wydrukowane typy parametrów metod w Guru99MethodMetaData.class
      7. Wydrukowane wyjątki są generowane przez metody w Guru99MethodMetaData.class

      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("*******************************************");}}}
      1. Utworzono obiekt klasy dla Guru99Constructor.class
      2. Uzyskano wszystkie metadane wszystkich konstruktorów w tablicy Constructor
      3. Wydrukowano wszystkie nazwy konstruktorów obecne w klasie Guru99Constructor.class
      4. Wydrukowano wszystkie modyfikatory dostępu konstruktorów w klasie Guru99Constructor.class
      5. Wydrukowane typy parametrów konstruktorów w Guru99Constructor.class
      6. Wydrukowane wyjątki są generowane przez konstruktorów w Guru99Constructor.class

      Podsumowanie:

      • 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.