Ποιος είναι ο ρόλος για ένα ClassLoader στην Java;



Αυτό το άρθρο είναι ένας ολοκληρωμένος οδηγός για το πώς λειτουργεί το ClassLoader στην Java. Συζητά τους τύπους, τις αρχές και τις μεθόδους του ClassLoader στην Java.

Ενώ εργαζόμαστε στην Java, χρησιμοποιούμε συχνά μεγάλο αριθμό μαθημάτων. Αυτές οι τάξεις Java δεν φορτώνονται ταυτόχρονα στη μνήμη, αλλά φορτώνονται όταν απαιτείται από μια εφαρμογή. Εδώ έρχονται στην εικόνα Java ClassLoaders. Έτσι, σε αυτό το άρθρο, θα συζητήσω τον τρόπο χρήσης του ClassLoader στην Java μαζί με παραδείγματα.

Τα ακόλουθα θέματα θα καλυφθούν σε αυτό το άρθρο:





  1. Τι είναι το ClassLoader;
  2. Τύποι ClassLoader
  3. Αρχές του ClassLoader
  4. Μέθοδοι του ClassLoader
  5. Custom ClassLoader

Ας ξεκινήσουμε!

Τι είναι το ClassLoader στην Java;

Το ClassLoader στην Java καλείται από το Java Runtime Environment για να φορτώνει δυναμικά τις κλάσεις όποτε απαιτείται από την εφαρμογή στο Εικονική μηχανή Java . Δεδομένου ότι οι ClassLoaders αποτελούν μέρος του Java Runtime Environment, η Java Virtual Machine δεν θα έχει ιδέα για τα υποκείμενα αρχεία και συστήματα αρχείων.



Τώρα, ας κατανοήσουμε τους διαφορετικούς τύπους ενσωματωμένων ClassLoaders στην Java.

Τύποι ClassLoader στην Java

Οι διαφορετικοί τύποι ClassLoaders στην Java είναι οι εξής:

Ας συζητήσουμε καθένα από αυτά ένα προς ένα.



Επέκταση ClassLoader

Όπως υποδηλώνει το όνομα, το Extension ClassLoader φορτώνει τις επεκτάσεις των βασικών κλάσεων Java από το JDK Βιβλιοθήκη επέκτασης. Είναι θυγατρικό του Bootstrap ClassLoader και φορτώνει τις επεκτάσεις από τον κατάλογο JRE / lib / text ή οποιονδήποτε άλλο κατάλογο που καθορίζεται στην ιδιότητα του συστήματος java.ext.dirs.

Εφαρμογή ή SystemLoader συστήματος

Η εφαρμογή ή το System ClassLoader είναι θυγατρικό του Extension ClassLoader. Αυτός ο τύπος ClassLoader φορτώνει όλες τις κλάσεις επιπέδου εφαρμογής που βρίσκονται στην επιλογή γραμμής εντολών -cp ή στη μεταβλητή περιβάλλοντος CLASSPATH.

Bootstrap ClassLoader

Όπως όλοι το γνωρίζουμε Μαθήματα Java φορτώνονται από μια παρουσία του java.lang.ClassLoade. Όμως, δεδομένου ότι οι ClassLoaders είναι τάξεις, το Bootstrap ClassLoader είναι υπεύθυνο για τη φόρτωση των εσωτερικών κλάσεων JDK. Το BootStrap ClassLoader είναι ένας κωδικός μηχανήματος που ξεκινά τη λειτουργία όταν το καλεί το JVM και φορτώνει τις κλάσεις από το rt.jar. Έτσι, μπορείτε να καταλάβετε ότι το Bootstrap ClassLoader που εξυπηρετεί δεν έχει γονικό ClassLoader και ως εκ τούτου είναι γνωστό ως Primordial ClassLoader.

Σημείωση: Η προτεραιότητα του Bootstrap είναι υψηλότερη από την επέκταση και η προτεραιότητα που δίνεται στο Extension ClassLoader είναι υψηλότερη από την εφαρμογή ClassLoader. Ανατρέξτε στην παρακάτω εικόνα:

Τύποι ClassLoader - ClassLoader σε Java - Edureka

Στη συνέχεια σε αυτό το άρθρο, ας κατανοήσουμε τις αρχές στις οποίες λειτουργεί το ClassLoader.

Αρχές του ClassLoader στην Java

Το σύνολο κανόνων βάσει των οποίων λειτουργεί το Java ClassLoader είναι οι ακόλουθες τρεις αρχές:

Ας καταλάβουμε κάθε ένα από αυτά.

Ιδιότητα μοναδικότητας

Αυτή η ιδιότητα διασφαλίζει ότι δεν υπάρχει επανάληψη τάξεων και όλα τα μαθήματα είναι μοναδικά. Η ιδιότητα μοναδικότητας διασφαλίζει επίσης ότι οι κλάσεις φορτώνονται από το γονικό ClassLoader δεν φορτώνονται από το θυγατρικό ClassLoader. Σε ένα σενάριο, όπου ο γονικός ClassLoader δεν μπορεί να βρει την τάξη, τότε η τρέχουσα παρουσία θα προσπαθήσει να το κάνει μόνη της.

Μοντέλο ανάθεσης

Το ClassLoader στην Java λειτουργεί με βάση το σύνολο των λειτουργιών που παρέχονται από το μοντέλο αντιπροσωπείας. Έτσι, κάθε φορά που δημιουργείται ένα αίτημα για εύρεση τάξης ή πόρου, τότε μια παρουσία ClassLoader θα αναθέτει την αναζήτηση της κλάσης ή του πόρου στον γονικό ClassLoader.

πώς να κλείσετε το πρόγραμμα java

Το σύνολο των λειτουργιών βάσει των οποίων λειτουργεί το ClassLoader έχει ως εξής:

  • Η Java Virtual Machine ελέγχει αν η κλάση φορτώνεται ή όχι, όποτε συναντά μια τάξη.
  • Σε περίπτωση φόρτωσης της κλάσης JVM προχωρά με την εκτέλεση της τάξης, αλλά σε ένα σενάριο όπου η κλάση δεν φορτώνεταιΤο JVM ζητά από το υποσύστημα Java ClassLoader να φορτώσει τη συγκεκριμένη κλάση. Μετά από αυτό, το υποσύστημα ClassLoader δίνει έλεγχο στο Application ClassLoader.
  • Το Application ClassLoader στη συνέχεια μεταβιβάζει το αίτημα στο Extension ClassLoader, το οποίο στη συνέχεια μεταβιβάζει το αίτημα στο Bootstrap ClassLoader.
  • Τώρα, το Bootstrap ClassLoader αναζητά στοBootstrap classpath για να ελέγξετε αν η τάξη είναι διαθέσιμη ή όχι. Εάν η τάξη είναι διαθέσιμη, τότε φορτώνεται, αλλιώς το αίτημα διαβιβάζεται ξανά στο Extension ClassLoader.
  • Το Extension ClassLoader ελέγχει την κλάση στο classpath επέκτασης.Εάν η τάξη είναι διαθέσιμη, τότε φορτώνεται, αλλιώς το αίτημα μεταφέρεται ξανά στο Application ClassLoader.
  • Τέλος, το Application ClassLoader αναζητά την κλάση στο classpath της εφαρμογής.Εάν η τάξη είναι διαθέσιμη, τότε φορτώνεται, αλλιώς θα δείτε μια εξαίρεση του ClassNotFoundException.

Ανατρέξτε στην παρακάτω εικόνα.

Αρχή ορατότητας

Σύμφωνα με αυτήν την αρχή, τα παιδικά μαθήματα είναι ορατά στις τάξεις που φορτώνονται από τους γονείς της ClassLoaders, αλλά το αντίστροφο δεν είναι αλήθεια. Έτσι, οι τάξεις που φορτώνονται από το Application ClassLoader έχουν ορατότητα στις κλάσεις που φορτώνονται από το Extension και Bootstrap ClassLoader.

Για παράδειγμα, εάν έχουμε δύο κατηγορίες: A & B, υποθέστε ότι η κλάση A φορτώνεται από το Application ClassLoader και η κλάση B φορτώνεται από το Extensions ClassLoader. Εδώ, οι κλάσεις Α και Β είναι ορατές σε όλες αυτές τις κλάσεις που φορτώνονται από το Application ClassLoader, αλλά η κλάση Β είναι ορατή μόνο σε αυτές τις κλάσεις που φορτώνονται από το Extension ClassLoader.

Επίσης, εάν προσπαθήσετε να φορτώσετε αυτές τις τάξεις χρησιμοποιώντας το Bootstrap ClassLoader, θα δείτε το java.lang.ClassNotFoundException . εξαίρεση.

Εντάξει, τώρα που γνωρίζετε τους τύπους ClassLoaders και τις αρχές πίσω από αυτό, ας εξετάσουμε μερικές σημαντικές μεθόδουςαπό το java.lang.ClassLoader τάξη.

Μέθοδοι ClassLoader σε Java

Λίγα απαραίτητα του ClassLoader έχουν ως εξής:

loadClass (Όνομα συμβολοσειράς, δυαδική επίλυση)

Αυτή η μέθοδος είναι το σημείο εισόδου του ClassLoader και χρησιμοποιείται για τη φόρτωση της κλάσης που αναφέρεται από το JVM. Παίρνει το όνομα του ως παράμετρος. Το JVM επικαλείται τη μέθοδο loadClass () για να επιλύσει τις αναφορές κλάσης ορίζοντας την τιμή boolean σε true. Μόνο εάν πρέπει να προσδιορίσουμε εάν η κλάση υπάρχει ή όχι, η παράμετρος boolean έχει οριστεί σε false.

Δήλωση:

public Class loadClass (Όνομα συμβολοσειράς, boolean resolving) ρίχνει ClassNotFoundException {

defineClass ()

Μια τελική μέθοδος που χρησιμοποιείται για τον ορισμό ενός πίνακα byte ως παρουσία μιας κλάσης. Σε περίπτωση που η κλάση δεν είναι έγκυρη τότε, ρίχνει ένα ClassFormatError.

Δήλωση:

προστατευμένο τελικό Class defineClass (String name, byte [] b, int off, int len) ρίχνει ClassFormatError

findClass (Όνομα συμβολοσειράς)

Η μέθοδος findClass χρησιμοποιείται για την εύρεση της καθορισμένης κλάσης. Έτσι, βρίσκει την κλάση με ένα πλήρως αναγνωρισμένο όνομα ως παράμετρο, αλλά δεν φορτώνει την τάξη. Η μέθοδος loadClass () επικαλείται αυτήν τη μέθοδο εάν ο γονικός ClassLoader δεν μπορεί να βρει την απαιτούμενη κλάση. Επίσης, εάν κανένας γονέας του ClassLoader δεν βρει την κλάση, η προεπιλεγμένη εφαρμογή ρίχνει a ClassNotFoundException.

Δήλωση:

προστατευμένη κλάση findClass (String name) ρίχνει ClassNotFoundException

Class.forName (Όνομα συμβολοσειράς, boolean initialize, ClassLoader loader)

Αυτή η μέθοδος χρησιμοποιείται για τη φόρτωση και την προετοιμασία της κλάσης. Δίνει τη δυνατότητα επιλογής οποιουδήποτε από τους ClassLoader και αν η παράμετρος ClassLoader είναι NULL, τότε αυτόματα χρησιμοποιείται το Bootstrap ClassLoader.

Δήλωση:

δημόσιο στατικό Class forName (Όνομα συμβολοσειράς, boolean initialize, ClassLoader loader) ρίχνει ClassNotFoundException

getParent ()

Η μέθοδος getParent χρησιμοποιείται για την επιστροφή του γονικού ClassLoader για ανάθεση.

Δήλωση:

δημόσιο τελικό ClassLoader getParent ()

getResource ()

Όπως υποδηλώνει το όνομα, η μέθοδος getResource () προσπάθησε να βρει έναν πόρο με το συγκεκριμένο όνομα. Αρχικά θα εκχωρήσει το αίτημα στον γονικό ClassLoader για τον πόρο. Σε περίπτωση που ο γονέας είναι μηδενικός, τότε αναζητείται η διαδρομή του ClassLoader που είναι ενσωματωμένη στο JVM. Τώρα, εάν αυτό αποτύχει, τότε η μέθοδος θα καλέσει το findResource (String) για να βρει τον πόρο, όπου το όνομα πόρου καθορίζεται ως είσοδος που μπορεί να είναι είτε το απόλυτο είτε το σχετικό classpath Στη συνέχεια, επιστρέφει ένα αντικείμενο URL για ανάγνωση του πόρου ή επιστρέφει μια τιμή null εάν ο πόρος δεν έχει επαρκή δικαιώματα για την επιστροφή του πόρου ή δεν βρίσκεται.

Δήλωση:

δημόσια διεύθυνση URL getResource (όνομα συμβολοσειράς)

Στη συνέχεια, σε αυτό το άρθρο σχετικά με το ClassLoader στην Java, ας κατανοήσουμε το Custom ClassLoader.

Custom ClassLoader στην Java

Οι ενσωματωμένοι ClassLoaders θα φροντίσουν για τις περισσότερες περιπτώσεις όπου τα αρχεία βρίσκονται ήδη στο σύστημα αρχείων, αλλά εάν θέλετε να φορτώσετε τις τάξεις από τον τοπικό σκληρό δίσκο, τότε πρέπει να χρησιμοποιήσετε προσαρμοσμένους ClassLoaders.

Δημιουργία προσαρμοσμένου ClassLoader

Για να δημιουργήσετε ένα προσαρμοσμένο ClassLoader, πρέπει να επεκτείνετε το ClassLoader τάξη και παράκαμψη του findClass () μέθοδος:

Παράδειγμα: Ας δημιουργήσουμε ένα προσαρμοσμένο ClassLoader που επεκτείνει τον προεπιλεγμένο ClassLoader και φορτώνει έναν πίνακα byte από το καθορισμένο αρχείο. Ανατρέξτε στον παρακάτω κώδικα.

εντολή java για τερματισμό προγράμματος
πακέτο edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Δείγμα επεκτείνει το ClassLoader {@Override public Class findClass (String samplename) ρίχνει ClassNotFoundException {byte [] bFustomFoadClass (samplename) return defineClass (samplename, b, 0, b.length)} ιδιωτικό byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () επιστροφή buffer}}

Με αυτό, καταλήγουμε σε αυτό το άρθρο σχετικά με το ClassLoader στην Java. Ελπίζω να καταλάβετε τι είναι οι ClassLoaders στην Java, οι μέθοδοι του, οι διαφορετικοί τύποι ClassLoaders κ.λπ.

Εάν βρήκατε αυτό το άρθρο στο 'ClassLoader in Java', ρίξτε μια ματιά στο από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία μάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων εκπαιδευόμενων σε όλο τον κόσμο. Είμαστε εδώ για να σας βοηθήσουμε με κάθε βήμα στο ταξίδι σας, για να γίνετε εκτός από αυτές τις ερωτήσεις της συνέντευξης java, έχουμε ένα πρόγραμμα σπουδών που έχει σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν Ιάβα Προγραμματιστής.

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του 'ClassLoader στην Java ' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.