[Java] Dynamic Loading

Πρόγραμμα πολύ συχνά αισθάνονται την ανάγκη να προσθέσει επί πλέον κομμάτια του κώδικα σε ένα σύστημα κατά τη χρήση του (αρκεί να σκεφτούμε, για παράδειγμα τη δυνατότητα να συμπεριληφθούν πρίζα σε κάθε εφαρμογή ενός, πρέπει να χρησιμοποιείται αμέσως μετά την "εγκατάσταση" τους) βλέπουμε πώς και σε ποια όρια, αυτό είναι εφικτό με τη γλώσσα του Ήλιου
Κατάρτιση κατά το χρόνο εκτέλεσης:
Πρώτον, είναι χρήσιμο να γνωρίζουμε ότι από οποιαδήποτε εφαρμογή Java μπορεί να επικαλεστεί το μεταγλωττιστή (javac), με τις συνήθεις παραμέτρους (classpath και οτιδήποτε άλλο) με ένα απλό
new String [ ] { Κύρια. Compile (new String [] ( , "-d", "bin /", filename + ".java" } ) ; "src / generatedCode /" + filename +. "java"))? |
Σημείωση: για τις διάφορες παραμέτρους (έφυγα από πολλούς, συμπεριλαμβανομένων των επιλογών της συλλογής) Αφήνω την τεκμηρίωση των APIs.
Φόρτωσης:
Επειδή έχετε το αρχείο. Από την τάξη για να φορτώσει εφαρμογή μας έχουμε 2 δρόμους, ξεκινώντας από την παραδοχή ότι γνωρίζουμε το όνομα της κατηγορίας:
- Αν δεν έχουμε συγκεκριμένες πληροφορίες σχετικά με την συναγάγει τάξη μέσω των μηχανισμών του προβληματισμού και των μεθόδων instantiation?
- Αν έχουμε δομημένη η "πρίζα" να εφαρμόσει μια γνωστή διεπαφή για instantiate ένα αντικείμενο (όπως θα δούμε προσεχώς) και κλήση των μεθόδων της διεπαφής.
2 I θα εξετάσει την υπόθεση επειδή εκτρέπομαι αλλιώς πάρα πολύ για ένα θέμα το οποίο είναι αρκετά περίπλοκο και ενδιαφέροντα προβληματισμό.
Σκεφτείτε την ακόλουθη περίπτωση:
Κλάσης Α (αυτό που θέλουμε να φορτώσει) Β υλοποιεί το περιβάλλον.
new ClassLoader ( ) ; ClassLoader loader = νέα ClassLoader ()? gt ; cls = loader. loadClass ( "A" ) ; Class & lt?? & Gt? CLS = φορτωτή. LoadClass ( "Α")? B ) cls. newInstance ( ) ; Istanza_di_A B = (Β) CLS. NewInstance ()? ... ) ; istanza_di_A. metodoDiA (...); |
Όπως μπορείτε να δείτε τη διαδικασία είναι πολύ απλή στην εφαρμογή της, ας δούμε τώρα ποια είναι η κύρια παραγραφής.
UnloadingReloading:
Δυστυχώς, το JVM δεν επιτρέπουν την εκφόρτωση των τάξεων φορτώνονται σε bytecode.
Σκεφτείτε την ιδέα του για την τροποποίηση του κώδικα της τάξης φορά μετά instantiating ένα αντικείμενο αυτού του τύπου στο πρόγραμμά μας. Θα θέλαμε, όπως φαίνεται φυσικό ότι, από τη στιγμή που φορτώνονται bytecode του άλλαξε την τάξη και την ανασύνθεση, τα νέα αντικείμενα του τύπου "Α" δημιουργούνται σύμφωνα με την τελευταία έκδοση διαθέσιμη.
Δυστυχώς, αυτό δεν συμβαίνει, θα δείτε γιατί.
Η ClassLoader, το οποίο προηγουμένως θα χρησιμοποιηθεί για την "επιβάρυνση", στη μνήμη του bytecode τάξης μας κατά το χρόνο εκτέλεσης, όπως έχουμε πει, δεν μπορεί να είναι (χειροκίνητα ή αυτόματα) για να χειριστεί την εκφόρτωση των τάξεων εμφανιστούν από την εφαρμογή. Κατά τη στιγμή της δημιουργίας ενός αντικειμένου είναι απλώς να ακολουθήσει την εξής αλγόριθμο (που μεταφέρουν ένα πολύ απλοποιημένο):
- Ελέγξτε για μια δομή δεδομένων (α hashtable) εάν υπάρχει μια καταχώρηση για την κατηγορία που του ζητήθηκε να φορτώσει πηγαίνοντας με το όνομα της κλάσης ( "class_name" -> "bytecode")?
- Εάν δεν μπορείτε να βρείτε εγγραφές που ταιριάζουν στο όνομα δημιουργεί ένα και, μετά την ανάγνωση του αρχείου. Κλάσης, εκτός από το bytecode σε μια τέτοια δομή, στη συνέχεια επιστρέφει μια εμφάνιση του προγράμματος.
- Εναλλακτικά, αν βρείτε μια καταχώρηση για το όνομα της κλάσης, δεν αφορά σε καμία περίπτωση να εκτιμήσει κατά πόσον το bytecode είναι ενημερωμένη ή δεν? Instantiates ένα αντικείμενο από bytecode αποθηκεύσει και να επιστραφεί το πρόγραμμα.
Όπως μπορείτε να φανταστείτε τότε οι αλλαγές θα τεθεί σε ισχύ μόνο όταν επανεκκίνηση του προγράμματος.
Η μόνη υπάρχουσα λύση είναι να εφαρμόσει ένα έθιμο ClassLoader οπότε ασχολούμαστε με caricareistanziare τάξεις που θέλουμε να χρησιμοποιήσουμε ως ένα plug-και ότι, εφόσον επέλθει οποιαδήποτε αλλαγή, μπορούμε να "πετάξει" (θέτοντας όλες τις αναφορές της στην null) reinstanziarene για μια νέα εφαρμογή που φροντίζει για τη διαχείριση του νέου κώδικα σε ιδιωτικά δομή δεδομένων του.
Δυσκίνητες πραγματική λύση; Λοιπόν, αν κάνει καλά για την ενημέρωση του ΡΟΠΟΠΟΙΗΣΕΙΣ Tomcat JSPs θα έλεγα ότι είναι σκόπιμο να προσαρμοστούν ![]()
Δημοτικότητα: 19% [?]
Λέξεις-κλειδιά: bytecode, ClassLoader, μεταγλώττισης, Dynamic Loading, HOTSWAP, Java, JSP, JVM, φόρτωσης, Ανανέωσης, Runtime, Tomcat, Εκφόρτωση
leave a response , or trackback from your own site. Μπορείτε να ακολουθήσετε οποιεσδήποτε απαντήσεις σε αυτή την καταχώρηση μέσω RSS 2.0 feed. Μπορείτε να αφήσετε μία απάντηση, ή trackback από το δικό σου site.



![Προσθέστε «[Java] Dynamic φόρτωσης» στο Del.icio.us Aggiungi '[Java] Dynamic Loading' a Del.icio.us](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delicious.png)
![Προσθέστε «[Java] Dynamic Loading 'to digg Aggiungi '[Java] Dynamic Loading' a digg](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/digg.png)
![Προσθέστε «[Java] Dynamic Loading 'στο FURL Aggiungi '[Java] Dynamic Loading' a FURL](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/furl.png)
![Προσθέστε «[Java] Δυναμική φόρτωσης» στο blinklist Aggiungi '[Java] Dynamic Loading' a blinklist](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/blinklist.png)
![Προσθέστε «[Java] Dynamic Loading 'to reddit Aggiungi '[Java] Dynamic Loading' a reddit](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/reddit.png)
![Προσθέστε «[Java] Dynamic Loading" για να του Feed Me Links Aggiungi '[Java] Dynamic Loading' a Feed Me Links](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/feedmelinks.png)
![Προσθέστε «[Java] Dynamic φόρτωσης» στο Technorati Aggiungi '[Java] Dynamic Loading' a Technorati](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technorati.png)
![Προσθέστε «[Java] Web Δυναμική φόρτωσης» στο Yahoo μου Aggiungi '[Java] Dynamic Loading' a Yahoo My Web](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Socializer Aggiungi '[Java] Dynamic Loading' a Socializer](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/socializer.png)
![Προσθέστε «[Java] Dynamic φόρτωσης» στο Ma.gnolia Aggiungi '[Java] Dynamic Loading' a Ma.gnolia](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/magnolia.png)
![Προσθέστε «[Java] Dynamic φόρτωσης» στους σελιδοδείκτες Google Aggiungi '[Java] Dynamic Loading' a Google Bookmarks](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/google.png)
![Προσθέστε «[Java] Dynamic Loading" σε Bloglines Aggiungi '[Java] Dynamic Loading' a Bloglines](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bloglines.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Squidoo Aggiungi '[Java] Dynamic Loading' a OKnotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/oknotizie.gif)
![Προσθέστε «[Java] Dynamic Loading 'στο Bookmark.it Aggiungi '[Java] Dynamic Loading' a Bookmark.it](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bookmark.png)
![Προσθέστε «[Java] Dynamic Loading" Ρωτήστε για Aggiungi '[Java] Dynamic Loading' a Ask](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/ask.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Delirious Aggiungi '[Java] Dynamic Loading' a Delirious](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delirious.png)
![Προσθέστε «[Java] Dynamic Loading 'to Live-MSN Aggiungi '[Java] Dynamic Loading' a Live-MSN](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/live.png)
![Προσθέστε «[Java] Dynamic φόρτωσης» στο Slashdot Aggiungi '[Java] Dynamic Loading' a SlashDot](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/slashdot.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Diggita Aggiungi '[Java] Dynamic Loading' a Diggita](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/diggita.png)
![Προσθέστε «[Java] Dynamic Loading 'στο FaceBook Aggiungi '[Java] Dynamic Loading' a FaceBook](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/facebook.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Wikio Aggiungi '[Java] Dynamic Loading' a Wikio](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/wikio.png)
![Προσθέστε «[Java] Dynamic Loading 'στο MySpace Aggiungi '[Java] Dynamic Loading' a MySpace](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/myspace.png)
![Προσθέστε «[Java] Dynamic Loading 'στο Twitter Aggiungi '[Java] Dynamic Loading' a Twitter](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/twitter.png)
![Προσθέστε «[Java] Dynamic Loading 'to Tailrank Aggiungi '[Java] Dynamic Loading' a Technotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technotizie.png)
Αφήστε μια απάντηση