Tutorial Java Reflection API με Παράδειγμα

Πίνακας περιεχομένων:

Anonim

Τι είναι ο προβληματισμός στην Java;

Το Java Reflection είναι η διαδικασία ανάλυσης και τροποποίησης όλων των δυνατοτήτων μιας κλάσης στο χρόνο εκτέλεσης. Το Reflection API στην Java χρησιμοποιείται για τον χειρισμό της κλάσης και των μελών της που περιλαμβάνουν πεδία, μεθόδους, κατασκευαστές κ.λπ. κατά το χρόνο εκτέλεσης.

Ένα πλεονέκτημα του API αντανάκλασης στην Java είναι ότι μπορεί να χειριστεί και ιδιωτικά μέλη της τάξης.

Το πακέτο java.lang.reflect παρέχει πολλές κλάσεις για την υλοποίηση του προβληματισμού java. Μέθοδοι της κλάσης java.lang.Class χρησιμοποιείται για τη συλλογή των πλήρων μεταδεδομένων μιας συγκεκριμένης κλάσης.

Σε αυτό το σεμινάριο, θα μάθετε-

  • Τι είναι ο προβληματισμός
  • Τάξη στο πακέτο java.lang.reflect
  • Μέθοδοι που χρησιμοποιούνται στο java.lang.Class
  • Πώς να λάβετε πλήρεις πληροφορίες σχετικά με μια τάξη
  • Παράδειγμα 1: Πώς να αποκτήσετε μεταδεδομένα της τάξης
  • Παράδειγμα 2: Τρόπος λήψης μεταδεδομένων μεταβλητής
  • Παράδειγμα 3: Τρόπος λήψης μεταδεδομένων της μεθόδου
  • Παράδειγμα 4: Τρόπος λήψης μεταδεδομένων κατασκευαστών

Τάξη στο πακέτο java.lang.reflect

Ακολουθεί μια λίστα με διάφορα μαθήματα Java στο java.lang.package για υλοποίηση προβληματισμού-

  • Πεδίο : Αυτή η τάξη χρησιμοποιείται για τη συλλογή δηλωτικών πληροφοριών όπως τύπος δεδομένων, τροποποιητής πρόσβασης, όνομα και τιμή μιας μεταβλητής.
  • Μέθοδος : Αυτή η τάξη χρησιμοποιείται για τη συλλογή δηλωτικών πληροφοριών, όπως τροποποιητής πρόσβασης, τύπος επιστροφής, όνομα, τύποι παραμέτρων και τύπος εξαίρεσης μιας μεθόδου.
  • Κατασκευαστής : Αυτή η κλάση χρησιμοποιείται για τη συλλογή δηλωτικών πληροφοριών, όπως τροποποιητής πρόσβασης, όνομα και τύποι παραμέτρων ενός κατασκευαστή.
  • Τροποποιητής : Αυτή η τάξη χρησιμοποιείται για τη συλλογή πληροφοριών σχετικά με έναν συγκεκριμένο τροποποιητή πρόσβασης.

Μέθοδοι που χρησιμοποιούνται στο java.lang.Class

  • Public String getName () : Επιστρέφει το όνομα της τάξης.
  • public Class getSuperclass () : Επιστρέφει την αναφορά super class
  • Δημόσια κλάση [] getInterfaces () : Επιστρέφει μια σειρά διεπαφών που εφαρμόζονται από την καθορισμένη κλάση
  • Public in 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;}}
  • Το ακόλουθο παράδειγμα δείχνει διαφορετικούς τρόπους δημιουργίας αντικειμένου της κλάσης "class":
  • Παράδειγμα 1: Πώς να αποκτήσετε μεταδεδομένα της τάξης

    Το ακόλουθο παράδειγμα δείχνει πώς μπορείτε να λάβετε μεταδεδομένα όπως: Όνομα κλάσης, όνομα super class, διεπαφές που υλοποιούνται και τροποποιητές πρόσβασης μιας κλάσης.

    Θα λάβουμε τα μεταδεδομένα της παρακάτω κλάσης με το όνομα Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Το όνομα της τάξης είναι: Guru99Base
    2. Οι τροποποιητές πρόσβασης είναι: δημόσιοι και αφηρημένοι
    3. Έχει εφαρμόσει διασυνδέσεις: Serializable και Cloneable
    4. Επειδή δεν έχει επεκτείνει καμία τάξη ρητά, είναι το super class: 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.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. εκτυπώστε το όνομα της τάξης χρησιμοποιώντας τη μέθοδο getName
    2. Εκτυπώστε το όνομα της σούπερ κλάσης χρησιμοποιώντας τη μέθοδο getSuperClass (). GetName ()
    3. Εκτυπώστε το όνομα των εφαρμοζόμενων διεπαφών
    4. Εκτυπώστε τους τροποποιητές πρόσβασης που χρησιμοποιούνται από την τάξη

    Παράδειγμα 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";}
    Βήματα για τη λήψη των μεταδεδομένων σχετικά με τις μεταβλητές στην παραπάνω κλάση:
    1. Δημιουργήστε το αντικείμενο κλάσης της παραπάνω κλάσης, δηλαδή Guru99VariableMetaData.class όπως παρακάτω:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Λάβετε τα μεταδεδομένα με τη μορφή πίνακα πεδίων χρησιμοποιώντας τις μεθόδους getFields () ή getDeclaredFields () όπως παρακάτω:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    Η μέθοδος getFields () επιστρέφει μεταδεδομένα της δημόσιας μεταβλητής από την καθορισμένη κλάση, καθώς και από την υπερ-κλάση.

    Η μέθοδος getDeclaredFields () επιστρέφει μεταδεδομένα όλων των μεταβλητών μόνο από την καθορισμένη κλάση.

    1. Λάβετε το όνομα των μεταβλητών χρησιμοποιώντας τη μέθοδο "public String getName ()".
    2. Λάβετε τον τύπο δεδομένων των μεταβλητών χρησιμοποιώντας τη μέθοδο "δημόσια τάξη getType ()".
    3. Λάβετε την τιμή της μεταβλητής χρησιμοποιώντας τη μέθοδο "public xxx get (Field)".

      Εδώ, το xxx θα μπορούσε να είναι ένα byte ή μικρότερο από κάθε τύπο τιμής που θέλουμε να πάρουμε.

    4. Αποκτήστε τους τροποποιητές πρόσβασης των μεταβλητών χρησιμοποιώντας τις μεθόδους 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Δημιουργήθηκε αντικείμενο κλάσης για Guru99VariableMetaData.class
      2. Πήρα όλα τα μεταδεδομένα των μεταβλητών σε έναν πίνακα πεδίου
      3. Εκτυπώθηκαν όλα τα ονόματα μεταβλητών στην τάξη Guru99VariableMetaData.class
      4. Εκτυπώθηκαν όλοι οι τύποι δεδομένων των μεταβλητών στην τάξη Guru99VariableMetaData.class
      5. Εκτυπώθηκαν όλοι οι τροποποιητές πρόσβασης των μεταβλητών στην τάξη Guru99VariableMetaData.class
      6. Εκτυπωμένες τιμές όλων των μεταβλητών στην Εκτύπωση όλων των τύπων δεδομένων των μεταβλητών στην τάξη Guru99VariableMetaData.class

      Παράδειγμα 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");}} 

      Βήματα για τη λήψη των μεταδεδομένων σχετικά με τις μεθόδους στην παραπάνω τάξη:

      1. Δημιουργήστε το αντικείμενο κλάσης της παραπάνω κλάσης, δηλαδή Guru99MethodMetaData.class όπως παρακάτω:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Λάβετε πληροφορίες μεθόδου σε έναν πίνακα μεθόδου χρησιμοποιώντας τη μέθοδο getMethods () και getDeclaredMethods () όπως παρακάτω:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        Η μέθοδος getMethods () επιστρέφει τα μεταδεδομένα των δημόσιων μεθόδων από την καθορισμένη κλάση καθώς και από την σούπερ κλάση.

        Η μέθοδος getDeclaredMethods () επιστρέφει μεταδεδομένα όλων των μεθόδων μόνο από την καθορισμένη κλάση.

      3. Λάβετε το όνομα της μεθόδου χρησιμοποιώντας τη μέθοδο getName () .
      4. Λάβετε τον τύπο επιστροφής της μεθόδου χρησιμοποιώντας τη μέθοδο getReturnType () .
      5. Λάβετε τροποποιητές πρόσβασης των μεθόδων χρησιμοποιώντας τις μεθόδους getModifiers () και Modifiers.toString (int i) .
      6. Λήψη τύπων παραμέτρων μεθόδου χρησιμοποιώντας τη μέθοδο getParameterTypes () που επιστρέφει έναν πίνακα κατηγορίας.
      7. Αποκτήστε εξαίρεση χρησιμοποιώντας τη μέθοδο getExceptionTypes () που επιστρέφει έναν πίνακα κατηγορίας.

      Εδώ, γράφουμε μια τάξη για να λάβουμε τα μεταδεδομένα των μεθόδων που υπάρχουν στην τάξη 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. Δημιουργήθηκε αντικείμενο κλάσης για Guru99MethodMetaData.class
      2. Πήρα όλα τα μεταδεδομένα όλων των μεθόδων σε έναν πίνακα μεθόδου
      3. Εκτυπώθηκαν όλα τα ονόματα μεθόδων που υπάρχουν στην τάξη Guru99MethodMetaData.class
      4. Τυπωμένοι τύποι επιστροφής των μεθόδων στην τάξη Guru99MethodMetaData.class
      5. Εκτυπώθηκαν όλοι οι τροποποιητές πρόσβασης των μεθόδων στην τάξη Guru99MethodMetaData.class
      6. Τυπωμένοι τύποι παραμέτρων των μεθόδων στο Guru99MethodMetaData.class
      7. Οι τυπωμένες εξαιρέσεις ρίχνονται με μεθόδους στο Guru99MethodMetaData.class

      Παράδειγμα 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("*******************************************");}}}
      1. Δημιουργήθηκε αντικείμενο κλάσης για Guru99Constructor.class
      2. Πήρα όλα τα μεταδεδομένα όλων των κατασκευαστών σε έναν πίνακα Κατασκευαστών
      3. Εκτυπώθηκαν όλα τα ονόματα του κατασκευαστή που υπάρχουν στην τάξη Guru99Constructor.class
      4. Εκτυπώθηκαν όλοι οι τροποποιητές πρόσβασης των κατασκευαστών στην τάξη Guru99Constructor.class
      5. Τυπωμένοι τύποι παραμέτρων των κατασκευαστών στο Guru99Constructor.class
      6. Οι τυπωμένες εξαιρέσεις ρίχνονται από τους κατασκευαστές στο Guru99Constructor.class

      Περίληψη:

      • Ο προγραμματισμός προβληματισμού στο java βοηθά στην ανάκτηση και την τροποποίηση πληροφοριών σχετικά με τα Classes και τα μέλη της Class όπως μεταβλητές, μέθοδοι, κατασκευαστές
      • Το Reflection API στην Java μπορεί να εφαρμοστεί χρησιμοποιώντας κλάσεις στο πακέτο java.lang.reflect και μεθόδους της κλάσης java.lang.Class.
      • Μερικές κοινά χρησιμοποιούμενες μέθοδοι της κατηγορίας java.lang.Class είναι getName (), getSuperclass (), getInterfaces (), getModifiers () κ.λπ.
      • Ορισμένες κοινές τάξεις στο πακέτο java.lang.reflect είναι Field, Method, Constructor, Modifier κ.λπ.
      • Το Reflection API μπορεί να έχει πρόσβαση σε ιδιωτικές μεθόδους και μεταβλητές μιας κλάσης που θα μπορούσαν να αποτελέσουν απειλή για την ασφάλεια.
      • Το Reflection API είναι μια ισχυρή ικανότητα που παρέχεται από την Java, αλλά συνοδεύεται από ορισμένα γενικά έξοδα, όπως χαμηλότερη απόδοση, ευπάθεια ασφαλείας και ζήτημα άδειας. Ως εκ τούτου, το API προβληματισμού πρέπει να αντιμετωπίζεται ως η τελευταία λύση για την εκτέλεση μιας λειτουργίας.