java reflection tutorial with examples
Αυτό το εκπαιδευτικό βίντεο εξηγεί τι είναι το Reflection και πώς να το εφαρμόσετε χρησιμοποιώντας το Reflection API:
Ο προβληματισμός στην Java είναι η επιθεώρηση και η αλλαγή της συμπεριφοράς ενός προγράμματος κατά το χρόνο εκτέλεσης.
Με τη βοήθεια αυτού του API προβληματισμού, μπορείτε να ελέγξετε τάξεις, κατασκευαστές, τροποποιητές, πεδία, μεθόδους και διεπαφές κατά το χρόνο εκτέλεσης. Για παράδειγμα, μπορείτε να πάρετε το όνομα της τάξης ή μπορείτε να λάβετε λεπτομέρειες για τα ιδιωτικά μέλη της τάξης.
Διαβάστε όλο μας Εκπαιδευτική σειρά JAVA για περισσότερες πληροφορίες σχετικά με τις έννοιες Java.
Εδώ είναι ένα εκπαιδευτικό βίντεο για το Java Reflection:
Τι θα μάθετε:
- Αντανάκλαση στην Ιάβα
- API προβληματισμού σε Java
- java.lang.Class Class
- Δημιουργία αντικειμένων java.lang.Class
- Λάβετε Super Class & Access Modifiers
- Λήψη διεπαφών
- Αντανάκλαση: Λήψη τιμής πεδίου
- Αντανάκλαση: Μέθοδος
- Αντανάκλαση: Κατασκευαστής
- Μειονεκτήματα του προβληματισμού
- Συχνές Ερωτήσεις
- Περισσότερα για το Java Reflection
- συμπέρασμα
Αντανάκλαση στην Ιάβα
Γνωρίζουμε ότι σε μια δεδομένη τάξη μπορούμε να τροποποιήσουμε τις ιδιότητες και τις μεθόδους της κατά τη στιγμή της μεταγλώττισης και είναι πολύ εύκολο να το κάνουμε. Είτε οι ιδιότητες και οι μέθοδοι είναι ανώνυμες είτε έχουν ονόματα, μπορούν να αλλάξουν κατά βούληση κατά τη διάρκεια της μεταγλώττισης.
Αλλά δεν μπορούμε να αλλάξουμε αυτές τις τάξεις ή μεθόδους ή πεδία κατά το χρόνο εκτέλεσης εν κινήσει. Με άλλα λόγια, είναι πολύ δύσκολο να αλλάξετε τη συμπεριφορά διαφόρων στοιχείων προγραμματισμού κατά το χρόνο εκτέλεσης, ειδικά για άγνωστα αντικείμενα.
Η γλώσσα προγραμματισμού Java παρέχει μια δυνατότητα που ονομάζεται 'Αντανάκλαση' που μας επιτρέπει να τροποποιήσουμε τη συμπεριφορά χρόνου εκτέλεσης μιας κλάσης ή πεδίου ή μεθόδου κατά το χρόνο εκτέλεσης.
Έτσι, μια Αντανάκλαση μπορεί να οριστεί ως α «Τεχνική επιθεώρησης και τροποποίησης της συμπεριφοράς χρόνου εκτέλεσης ενός άγνωστου αντικειμένου κατά το χρόνο εκτέλεσης. Ένα αντικείμενο μπορεί να είναι μια τάξη, ένα πεδίο ή μια μέθοδος. '
Το Reflection είναι μια 'Διεπαφή προγραμματισμού εφαρμογών' (API) που παρέχεται από την Java.
Η διαδικασία «Αντανάκλαση» απεικονίζεται παρακάτω.
Στην παραπάνω αναπαράσταση, μπορούμε να δούμε ότι έχουμε ένα άγνωστο αντικείμενο. Στη συνέχεια, χρησιμοποιούμε το Reflection API σε αυτό το αντικείμενο. Ως αποτέλεσμα, μπορούμε να τροποποιήσουμε τη συμπεριφορά αυτού του αντικειμένου κατά το χρόνο εκτέλεσης.
Έτσι μπορούμε να χρησιμοποιήσουμε το Reflection API στα προγράμματά μας με σκοπό την τροποποίηση της συμπεριφοράς του αντικειμένου. Τα αντικείμενα μπορεί να είναι οτιδήποτε όπως μέθοδοι, διεπαφές, τάξεις κ.λπ. Επιθεωρούμε αυτά τα αντικείμενα και μετά αλλάζουμε τη συμπεριφορά τους κατά το χρόνο εκτέλεσης χρησιμοποιώντας το API προβληματισμού.
Στην Java, τα «java.lang» και «java.lang.reflect» είναι τα δύο πακέτα που παρέχουν τάξεις για προβληματισμό. Η ειδική κλάση 'java.lang.Class' παρέχει τις μεθόδους και τις ιδιότητες για την εξαγωγή μεταδεδομένων χρησιμοποιώντας τις οποίες μπορούμε να ελέγξουμε και να τροποποιήσουμε τη συμπεριφορά της τάξης.
Χρησιμοποιούμε το Reflection API που παρέχεται από τα παραπάνω πακέτα για να τροποποιήσουμε την τάξη και τα μέλη της, συμπεριλαμβανομένων πεδίων, μεθόδων, κατασκευαστών κ.λπ. κατά το χρόνο εκτέλεσης. Ένα διακριτικό χαρακτηριστικό του Reflection API είναι ότι μπορούμε επίσης να χειριστούμε τα προσωπικά μέλη δεδομένων ή τις μεθόδους της κλάσης.
Το API Reflection χρησιμοποιείται κυρίως σε:
- Ο προβληματισμός χρησιμοποιείται κυρίως σε εργαλεία εντοπισμού σφαλμάτων, JUnit και πλαίσια για την επιθεώρηση και την αλλαγή της συμπεριφοράς κατά το χρόνο εκτέλεσης.
- IDE (Ολοκληρωμένο Περιβάλλον Ανάπτυξης) Π.χ. Eclipse IDE, NetBeans κ.λπ.
- Εργαλεία δοκιμής κ.λπ.
- Χρησιμοποιείται, όταν η εφαρμογή σας διαθέτει βιβλιοθήκες τρίτων και όταν θέλετε να μάθετε για τις διαθέσιμες τάξεις και μεθόδους.
API προβληματισμού σε Java
Χρησιμοποιώντας το Reflection API, μπορούμε να εφαρμόσουμε τον προβληματισμό στις ακόλουθες οντότητες:
- Πεδίο : Η κλάση πεδίου έχει πληροφορίες που χρησιμοποιούμε για να δηλώσουμε μια μεταβλητή ή ένα πεδίο όπως ένας τύπος δεδομένων (int, double, String κ.λπ.), τροποποιητής πρόσβασης (ιδιωτικός, δημόσιος, προστατευμένος κ.λπ.), όνομα (αναγνωριστικό) και τιμή.
- Μέθοδος : Η κλάση Μέθοδος μπορεί να μας βοηθήσει να εξαγάγουμε πληροφορίες όπως τροποποιητής πρόσβασης της μεθόδου, τύπος επιστροφής μεθόδου, όνομα μεθόδου, τύπους παραμέτρων μεθόδου και τύπους εξαιρέσεων που δημιουργούνται από τη μέθοδο.
- Οικοδόμος : Η κλάση κατασκευαστή παρέχει πληροφορίες σχετικά με τον κατασκευαστή κλάσης που περιλαμβάνει τροποποιητή πρόσβασης κατασκευαστή, όνομα κατασκευαστή και τύπους παραμέτρων.
- Επεξεργασία : Η τάξη τροποποιητών μας δίνει πληροφορίες σχετικά με έναν συγκεκριμένο τροποποιητή πρόσβασης.
Όλες οι παραπάνω κατηγορίες αποτελούν μέρος του πακέτου java.lang.reflect. Στη συνέχεια, θα συζητήσουμε καθένα από αυτά τα μαθήματα και θα χρησιμοποιήσουμε παραδείγματα προγραμματισμού για να δείξουμε τον προβληματισμό σε αυτές τις τάξεις.
Ας ξεκινήσουμε πρώτα με την τάξη java.lang.Class.
java.lang.Class Class
Το java.lang. Η κλάση περιέχει όλες τις πληροφορίες και τα δεδομένα σχετικά με τις κλάσεις και τα αντικείμενα κατά το χρόνο εκτέλεσης. Αυτή είναι η κύρια τάξη που χρησιμοποιείται για προβληματισμό.
Η κλάση java.lang.Class παρέχει:
- Μέθοδοι για την ανάκτηση μεταδεδομένων τάξης στο χρόνο εκτέλεσης.
- Μέθοδοι επιθεώρησης και τροποποίησης της συμπεριφοράς μιας τάξης στο χρόνο εκτέλεσης.
Δημιουργία αντικειμένων java.lang.Class
Μπορούμε να δημιουργήσουμε αντικείμενα του java.lang.Class χρησιμοποιώντας μία από τις ακόλουθες επιλογές.
pl sql ερωτήσεις συνέντευξης για 5 χρόνια εμπειρίας
# 1). Επέκταση κλάσης
Η πρώτη επιλογή για τη δημιουργία ενός αντικειμένου της κλάσης είναι η χρήση της επέκτασης .class.
Για παράδειγμα,εάν το Test είναι κλάση, τότε μπορούμε να δημιουργήσουμε ένα αντικείμενο Class ως εξής:
Class obj_test = Test.class;
Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε το obj_test για να κάνουμε προβληματισμό, καθώς αυτό το αντικείμενο θα έχει όλες τις πληροφορίες σχετικά με την τάξη Test.
# 2) forName () μέθοδος
Η μέθοδος forName () παίρνει το όνομα της κλάσης ως όρισμα και επιστρέφει το αντικείμενο κλάσης.
Για παράδειγμα,το αντικείμενο της κλάσης δοκιμής μπορεί να δημιουργηθεί ως εξής:
class obj_test = Class.forName (“Test”);
# 3) μέθοδος getClas ()
Η μέθοδος getClass () χρησιμοποιεί αντικείμενο κλάσης για να πάρει το αντικείμενο java.lang.Class.
Για παράδειγμα,εξετάστε το ακόλουθο κομμάτι κώδικα:
Test obj = new Test (); Class obj_test = obj.getClass ();
Στην πρώτη γραμμή, δημιουργήσαμε ένα αντικείμενο δοκιμαστικής κλάσης. Στη συνέχεια, χρησιμοποιώντας αυτό το αντικείμενο κάλεσε τη μέθοδο 'getClass ()' για να λάβουμε ένα αντικείμενο obj_test του java.lang.Class.
Λάβετε Super Class & Access Modifiers
Το java.lang.class παρέχει μια μέθοδο 'getSuperClass ()' που χρησιμοποιείται για να πάρει το superclass οποιασδήποτε κλάσης.
Παρομοίως, παρέχει μια μέθοδο getModifier () που επιστρέφει τον τροποποιητή πρόσβασης της κλάσης.
Το παρακάτω παράδειγμα δείχνει τη μέθοδο getSuperClass ().
import java.lang.Class; import java.lang.reflect.*; //define Person interface interface Person { public void display(); } //declare class Student that implements Person class Student implements Person { //define interface method display public void display() { System.out.println('I am a Student'); } } class Main { public static void main(String[] args) { try { // create an object of Student class Student s1 = new Student(); // get Class object using getClass() Class obj = s1.getClass(); // get the superclass of Student Class superClass = obj.getSuperclass(); System.out.println('Superclass of Student Class: ' + superClass.getName()); } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Στο παραπάνω παράδειγμα προγραμματισμού, το άτομο διασύνδεσης ορίζεται με τη μέθοδο μιας οθόνης «οθόνη ()». Στη συνέχεια, ορίζουμε μια μαθητική τάξη που εφαρμόζει τη διεπαφή προσώπων Στην κύρια μέθοδο, χρησιμοποιούμε τη μέθοδο getClass () για να ανακτήσουμε το αντικείμενο Class και, στη συνέχεια, να αποκτήσουμε πρόσβαση στο γονικό ή superclass του αντικειμένου Student χρησιμοποιώντας τη μέθοδο getSuperClass ().
Λήψη διεπαφών
Εάν η κλάση εφαρμόζει ορισμένες διεπαφές, τότε μπορούμε να πάρουμε αυτά τα ονόματα διεπαφών χρησιμοποιώντας τη μέθοδο getInterfaces () της java.lang.Class. Για αυτό, πρέπει να κάνουμε έναν προβληματισμό σχετικά με την τάξη Java.
Το παρακάτω παράδειγμα προγραμματισμού απεικονίζει τη χρήση της μεθόδου getInterfaces () στο Java Reflection.
import java.lang.Class; import java.lang.reflect.*; //define Interface Animals and PetAnimals interface Animals { public void display(); } interface PetAnimals { public void makeSound(); } //define a class Dog that implements above interfaces class Dog implements Animals, PetAnimals { //define interface method display public void display() { System.out.println('This is a PetAnimal::Dog'); } //define interface method makeSound public void makeSound() { System.out.println('Dog makes sound::Bark bark'); } } class Main { public static void main(String[] args) { try { // create an object of Dog class Dog dog = new Dog(); // get class object Class obj = dog.getClass(); // get the interfaces implemented by Dog Class[] objInterface = obj.getInterfaces(); System.out.println('Class Dog implements following interfaces:'); //print all the interfaces implemented by class Dog for(Class citem : objInterface) { System.out.println('Interface Name: ' + citem.getName()); } } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Στο παραπάνω πρόγραμμα, έχουμε ορίσει δύο διεπαφές, δηλαδή ζώα και ζώα. Στη συνέχεια, ορίζουμε μια κατηγορία Dog, η οποία εφαρμόζει και τις δύο αυτές διεπαφές.
Στην κύρια μέθοδο, ανακτούμε το αντικείμενο της κλάσης Dog στο java.lang.Class για να κάνουμε ανάκλαση. Στη συνέχεια, χρησιμοποιούμε τη μέθοδο getInterfaces () για να ανακτήσουμε τις διεπαφές που εφαρμόζονται από την κατηγορία Dog.
Αντανάκλαση: Λήψη τιμής πεδίου
Όπως ήδη αναφέρθηκε, το πακέτο java.lang.reflect παρέχει την κλάση πεδίου που μας βοηθά να αντικατοπτρίζουμε τα πεδία ή τα δεδομένα των μελών της τάξης.
Παρατίθενται παρακάτω οι μέθοδοι που παρέχονται από την κλάση πεδίου για την αντανάκλαση ενός πεδίου.
Μέθοδος | Περιγραφή |
---|---|
getField («πεδίο όνομα») | Επιστρέφει το πεδίο (δημόσιο) με καθορισμένο όνομα πεδίου. |
getFields () | Επιστρέφει όλα τα δημόσια πεδία (τόσο για τάξη όσο και για superclass). |
getDeclaredFields () | Ανακτά όλα τα πεδία της τάξης. |
getModifier () | Επιστρέφει ακέραια αναπαράσταση του τροποποιητή πρόσβασης του πεδίου. |
σύνολο (classObject, τιμή) | Εκχωρεί την καθορισμένη τιμή στο πεδίο. |
λήψη (classObject) | Ανακτά την τιμή πεδίου. |
setAccessible (boolean) | Κάντε το ιδιωτικό πεδίο προσβάσιμο με την αλήθεια. |
getDeclaredField ('πεδίοName') | Επιστρέφει το πεδίο με ένα καθορισμένο όνομα. |
Παρακάτω δίνονται δύο παραδείγματα προβληματισμού που καταδεικνύουν τον προβληματισμό στον δημόσιο και τον ιδιωτικό τομέα.
Το παρακάτω πρόγραμμα Java δείχνει τον προβληματισμό σε ένα δημόσιο πεδίο.
import java.lang.Class; import java.lang.reflect.*; class Student { public String StudentName; } class Main { public static void main(String[] args) { try{ Student student = new Student(); // get an object of the class Class Class obj = student.getClass(); // provide field name and get the field info Field student_field = obj.getField('StudentName'); System.out.println('Details of StudentName class field:'); // set the value of field student_field.set(student, 'Lacey'); // get the access modifier of StudentName int mod1 = student_field.getModifiers(); String modifier1 = Modifier.toString(mod1); System.out.println('StudentName Modifier::' + modifier1); // get the value of field by converting in String String typeValue = (String)student_field.get(student); System.out.println('StudentName Value::' + typeValue); } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Σε αυτό το πρόγραμμα, έχουμε δηλώσει μια τάξη 'Student' με δημόσιο πεδίο StudentName. Στη συνέχεια, χρησιμοποιώντας τη διεπαφή API της κλάσης Field, εκτελούμε προβληματισμό σχετικά με το πεδίο StudentName και ανακτούμε τον τροποποιητή πρόσβασης και την τιμή του.
Το επόμενο πρόγραμμα εκτελεί προβληματισμό σχετικά με ένα ιδιωτικό πεδίο της τάξης. Οι λειτουργίες είναι παρόμοιες εκτός από το ότι υπάρχει μία επιπλέον κλήση λειτουργίας για το ιδιωτικό πεδίο. Πρέπει να καλέσουμε το setAccessible (true) για το ιδιωτικό πεδίο. Στη συνέχεια, κάνουμε προβληματισμό σχετικά με αυτό το πεδίο με παρόμοιο τρόπο όπως το δημόσιο πεδίο.
import java.lang.Class; import java.lang.reflect.*; class Student { private String rollNo; } class Main { public static void main(String[] args) { try { Student student = new Student(); // get the object for class Student in a Class. Class obj = student.getClass(); // access the private field Field field2 = obj.getDeclaredField('rollNo'); // make the private field accessible field2.setAccessible(true); // set the value of rollNo field2.set(student, '27'); System.out.println('Field Information of rollNo:'); // get the access modifier of rollNo int mod2 = field2.getModifiers(); String modifier2 = Modifier.toString(mod2); System.out.println('rollNo modifier::' + modifier2); // get the value of rollNo converting in String String rollNoValue = (String)field2.get(student); System.out.println('rollNo Value::' + rollNoValue); } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Αντανάκλαση: Μέθοδος
Παρόμοια με τα πεδία της τάξης, μπορούμε επίσης να κάνουμε προβληματισμό σχετικά με τις μεθόδους της τάξης και να τροποποιήσουμε τη συμπεριφορά τους στο χρόνο εκτέλεσης. Για αυτό, χρησιμοποιούμε την κλάση Method του πακέτου java.lang.reflect.
Παρατίθενται παρακάτω οι συναρτήσεις που παρέχονται από την κλάση Method για τον προβληματισμό της μεθόδου class.
Μέθοδος | Περιγραφή |
---|---|
getMethods () | Ανακτά όλες τις δημόσιες μεθόδους που ορίζονται στην τάξη και το superclass της. |
getDeclaredMethod () | Επιστρέφει μεθόδους που δηλώθηκαν στην τάξη. |
getName () | Επιστρέφει τα ονόματα της μεθόδου. |
getModifiers () | Επιστρέφει ακέραια αναπαράσταση του τροποποιητή πρόσβασης της μεθόδου. |
getReturnType () | Επιστρέφει τον τύπο επιστροφής μεθόδου. |
Το παρακάτω παράδειγμα δείχνει την αντανάκλαση των μεθόδων κλάσης σε Java χρησιμοποιώντας τα παραπάνω API.
import java.lang.Class; import java.lang.reflect.*; //declare a class Vehicle with four methods class Vehicle { public void display() { System.out.println('I am a Vehicle!!'); } protected void start() { System.out.println('Vehicle Started!!!'); } protected void stop() { System.out.println('Vehicle Stopped!!!'); } private void serviceVehicle() { System.out.println('Vehicle serviced!!'); } }class Main { public static void main(String[] args) { try { Vehicle car = new Vehicle(); // create an object of Class Class obj = car.getClass(); // get all the methods using the getDeclaredMethod() in an array Method[] methods = obj.getDeclaredMethods(); // for each method get method info for(Method m : methods) { System.out.println('Method Name: ' + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.print('Modifier: ' + Modifier.toString(modifier) + ' '); // get the return type of method System.out.print('Return Type: ' + m.getReturnType()); System.out.println('
'); } } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Στο παραπάνω πρόγραμμα, βλέπουμε ότι η μέθοδος getDeclaredMethods επιστρέφει τη σειρά μεθόδων που δηλώνονται από την τάξη. Στη συνέχεια επαναλαμβάνουμε αυτόν τον πίνακα και εμφανίζουμε τις πληροφορίες κάθε μεθόδου.
Αντανάκλαση: Κατασκευαστής
Μπορούμε να χρησιμοποιήσουμε την κατηγορία 'Κατασκευαστής' του πακέτου java.lang.reflect για να ελέγξουμε και να τροποποιήσουμε τους κατασκευαστές μιας κλάσης Java.
Η κατηγορία κατασκευαστή παρέχει τις ακόλουθες μεθόδους για το σκοπό αυτό.
Μέθοδος | Περιγραφή |
---|---|
getConstructors () | Επιστρέφει όλους τους κατασκευαστές που δηλώνονται στην κατηγορία και το superclass του. |
getDeclaredConstructor () | Επιστρέφει όλους τους δηλωμένους κατασκευαστές. |
getName () | Ανακτά το όνομα του κατασκευαστή. |
getModifiers () | Επιστρέφει την ακέραια αναπαράσταση του τροποποιητή πρόσβασης των κατασκευαστών. |
getParameterCount () | Επιστρέφει τον συνολικό αριθμό παραμέτρων για κατασκευαστές. |
Το παρακάτω παράδειγμα προβληματισμού δείχνει τον προβληματισμό των κατασκευαστών μιας τάξης στην Java. Όπως και η αντανάκλαση της μεθόδου, εδώ επίσης η μέθοδος getDeclaredConstructors επιστρέφει μια σειρά κατασκευαστών για μια τάξη. Στη συνέχεια, διασχίζουμε αυτόν τον κατασκευαστή για να εμφανίσουμε πληροφορίες για κάθε κατασκευαστή.
import java.lang.Class; import java.lang.reflect.*; //declare a class Person with three constructors class Person { public Person() { } //constructor with no parameters public Person(String name) { } //constructor with 1 parameter private Person(String name, int age) {} //constructor with 2 parameters } class Main { public static void main(String[] args) { try { Person person = new Person(); Class obj = person.getClass(); // get array of constructors in a class using getDeclaredConstructor() Constructor[] constructors = obj.getDeclaredConstructors(); System.out.println('Constructors for Person Class:'); for(Constructor c : constructors) { // get names of constructors System.out.println('Constructor Name: ' + c.getName()); // get access modifier of constructors int modifier = c.getModifiers(); System.out.print ('Modifier: ' + Modifier.toString(modifier) + ' '); // get the number of parameters in constructors System.out.println('Parameters: ' + c.getParameterCount()); //if there are parameters, get parameter type of each parameter if(c.getParameterCount() > 0){ Class[] paramList=c.getParameterTypes(); System.out.print ('Constructor parameter types :'); for (Class class1 : paramList) { System.out.print(class1.getName() +' '); } } System.out.println('
'); } } catch(Exception e) { e.printStackTrace(); } } }
Παραγωγή
Μειονεκτήματα του προβληματισμού
Ο προβληματισμός είναι ισχυρός, αλλά δεν πρέπει να χρησιμοποιείται αδιάκριτα. Εάν είναι δυνατή η χρήση χωρίς χρήση αντανάκλασης, τότε είναι προτιμότερο να μην το χρησιμοποιείτε.
Παρακάτω αναφέρονται μερικά μειονεκτήματα του προβληματισμού:
- Απόδοση απόδοσης: Αν και η αντανάκλαση είναι ένα ισχυρό χαρακτηριστικό, οι ανακλαστικές λειτουργίες εξακολουθούν να έχουν χαμηλότερη απόδοση από τις μη ανακλαστικές λειτουργίες. Ως εκ τούτου, πρέπει να αποφύγουμε τη χρήση αντανακλάσεων σε εφαρμογές κρίσιμης απόδοσης.
- Περιορισμοί ασφαλείας: Καθώς η αντανάκλαση είναι μια λειτουργία χρόνου εκτέλεσης, ενδέχεται να απαιτούνται δικαιώματα χρόνου εκτέλεσης. Έτσι, για τις εφαρμογές που απαιτούν την εκτέλεση του κώδικα σε περιορισμένη ρύθμιση ασφαλείας, τότε ο προβληματισμός μπορεί να μην είναι χρήσιμος.
- Έκθεση εσωτερικών: Με τη χρήση προβληματισμού, μπορούμε να έχουμε πρόσβαση σε ιδιωτικά πεδία και μεθόδους σε μια τάξη. Έτσι, η αντανάκλαση σπάει την αφαίρεση που μπορεί να καταστήσει τον κώδικα μη ασκήσιμο και δυσλειτουργικό.
Συχνές Ερωτήσεις
Q # 1) Γιατί χρησιμοποιείται το Reflection στην Java;
Απάντηση: Χρησιμοποιώντας το προβληματισμό μπορούμε να επιθεωρήσουμε τάξεις, διεπαφές, κατασκευαστές, πεδία και μεθόδους κατά το χρόνο εκτέλεσης, ακόμα κι αν είναι ανώνυμες κατά τη στιγμή της μεταγλώττισης. Αυτή η επιθεώρηση μας επιτρέπει να τροποποιήσουμε τη συμπεριφορά αυτών των οντοτήτων κατά το χρόνο εκτέλεσης.
Ε # 2) Πού χρησιμοποιείται το Reflection;
Απάντηση: Ο προβληματισμός χρησιμοποιείται σε γραπτά πλαίσια που λειτουργούν με τάξεις που ορίζονται από το χρήστη, όπου ο προγραμματιστής δεν γνωρίζει καν τι θα είναι οι τάξεις ή άλλες οντότητες.
Q # 3) Είναι αργή η αντανάκλαση Java;
Απάντηση: Ναι, είναι πιο αργό από τον κώδικα που δεν αντικατοπτρίζει.
Q # 4) Είναι κακό Java Reflection;
Απάντηση: Κατά κάποιο τρόπο, ναι. Πρώτα απ 'όλα, χάνουμε την ασφάλεια του χρόνου μεταγλώττισης. Χωρίς ασφάλεια χρόνου μεταγλώττισης, ενδέχεται να λάβουμε σφάλματα χρόνου εκτέλεσης που ενδέχεται να επηρεάσουν τους τελικούς χρήστες. Θα είναι επίσης δύσκολο να εντοπιστεί το σφάλμα.
Q # 5) Πώς σταματάτε έναν προβληματισμό στην Java;
Απάντηση: Απλώς αποφεύγουμε τη χρήση προβληματισμού γράφοντας λειτουργίες που δεν αντικατοπτρίζονται Ή ίσως μπορούμε να χρησιμοποιήσουμε μερικούς γενικούς μηχανισμούς όπως μια προσαρμοσμένη επικύρωση με προβληματισμό.
Περισσότερα για το Java Reflection
Το πακέτο java.lang.reflect έχει τις κλάσεις και τις διεπαφές για να κάνει προβληματισμό. Και το java.lang.class μπορεί να χρησιμοποιηθεί ως σημείο εισόδου για τον προβληματισμό.
Πώς να αποκτήσετε τα αντικείμενα της τάξης:
1. Εάν έχετε παρουσία ενός αντικειμένου,
κλάση c = obj.getclass ();
2. Εάν γνωρίζετε τον τύπο της τάξης,
κλάση c = type.getClass ();
3. Εάν γνωρίζετε το όνομα της τάξης,
Κατηγορία c = Class.forName ('com.demo.Mydemoclass');
Πώς να αποκτήσετε τα μέλη της τάξης:
Τα μέλη της τάξης είναι πεδία (μεταβλητές τάξης) και μέθοδοι.
- getFields () - Χρησιμοποιείται για τη λήψη όλων των πεδίων εκτός από τα ιδιωτικά πεδία.
- getDeclaredField () - Χρησιμοποιήθηκε για να πάρει τα ιδιωτικά πεδία.
- getDeclaredFields () - Χρησιμοποιήθηκε για να αποκτήσετε τα ιδιωτικά και δημόσια πεδία.
- getMethods () - Χρησιμοποιήθηκε για να πάρει όλες τις μεθόδους εκτός από τις ιδιωτικές μεθόδους.
- getDeclaredMethods () - Χρησιμοποιείται για τη λήψη δημόσιων και ιδιωτικών μεθόδων.
Προγράμματα επίδειξης:
ReflectionHelper.java:
Αυτή είναι η τάξη στην οποία πρόκειται να επιθεωρήσουμε χρησιμοποιώντας το API προβληματισμού.
εντολή grep στο linux με παραδείγματα
class ReflectionHelper { private int age; private String name; public String deptName; public int empID; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
ReflectionDemo.java
public class ReflectionDemo { public static void main(String[] args) throws NoSuchFieldException, SecurityException { //get the class Class ReflectionHelperclass=ReflectionHelper.class; //get the name of the class String className = ReflectionHelperclass.getName(); System.out.println('className=='+className); System.out.println('getModifiers'+ReflectionHelperclass.getModifier s()); System.out.println('getSuperclass'+ReflectionHelperclass.getSupercla ss()); System.out.println('getPackage'+ReflectionHelperclass.getPackage()); Field[] fields =ReflectionHelperclass.getFields(); //getting only the public fields for(Field oneField : fields) { Field field = ReflectionHelperclass.getField(oneField.getName()); String fieldname = field.getName(); System.out.println('only the public fieldnames:::::'+fieldname); } //getting all the fields of the class Field[] privatefields =ReflectionHelperclass.getDeclaredFields(); for(Field onefield : privatefields) { Field field = ReflectionHelperclass.getDeclaredField(onefield.getName()); String fieldname = field.getName(); System.out.println('all the fieldnames in the class:::'+fieldname); } Method[] methods =ReflectionHelperclass.getDeclaredMethods(); for(Method m: methods) { System.out.println('methods::::'+m.getName()); } }}
συμπέρασμα
Αυτό το σεμινάριο εξήγησε λεπτομερώς το API προβληματισμού στην Java. Είδαμε πώς να κάνουμε αντανάκλαση τάξεων, διεπαφών, πεδίων, μεθόδων και κατασκευαστών μαζί με μερικά μειονεκτήματα του προβληματισμού.
Το Reflection είναι ένα σχετικά προηγμένο χαρακτηριστικό στην Java, αλλά θα πρέπει να χρησιμοποιείται από προγραμματιστές που έχουν ισχυρό γνώρισμα στη γλώσσα. Αυτό συμβαίνει επειδή μπορεί να προκαλέσει απροσδόκητα σφάλματα και αποτελέσματα εάν δεν χρησιμοποιούνται με προσοχή.
Αν και η αντανάκλαση είναι ισχυρή, θα πρέπει να χρησιμοποιείται προσεκτικά. Ωστόσο, χρησιμοποιώντας το προβληματισμό μπορούμε να αναπτύξουμε εφαρμογές που δεν γνωρίζουν τάξεις και άλλες οντότητες μέχρι το χρόνο εκτέλεσης.
=> Ρίξτε μια ματιά στον οδηγό για αρχάριους Java εδώ.
Συνιστώμενη ανάγνωση
- Εκπαιδευτικό μάθημα Java Scanner με παραδείγματα
- Java Integer και Java BigInteger Class με παραδείγματα
- Εκπαιδευτικό πρόγραμμα JAVA για αρχάριους: 100+ πρακτικά εκπαιδευτικά βίντεο Java
- Εισαγωγή στη γλώσσα προγραμματισμού Java - Video Tutorial
- Τι είναι το Java Java | Java Vector Class Tutorial με παραδείγματα
- Java Interface και Abstract Class Tutorial με παραδείγματα
- Java substring () Μέθοδος - Εκμάθηση με παραδείγματα
- Εκμάθηση Java Συλλογές Πλαίσιο (JCF)