[Java] Chargement dynamique

Programme très souvent sentir le besoin d'insérer des morceaux de code supplémentaire dans un système lors de son utilisation (considérer, par exemple la possibilité d'inclure de brancher n'importe quelle application un, ils doivent être utilisées immédiatement après leur "installation"), nous voyons comment et dans quelles limites, ce qui est réalisable avec la langue du Soleil
Compilation à l'exécution:
Premièrement, il est utile de savoir que de n'importe quelle application Java peut invoquer le compilateur (javac) avec les paramètres habituels (classpath et tout le reste) avec un simple
new String [ ] { Main. Compile (new String [] ( , "-d", "bin /", filename + ".java" } ) ; "generatedCode src / /" + nom +. "java")); |
NB: pour les différents paramètres (j'ai laissé de côté beaucoup, y compris les options de compilation) Je laisse la documentation des API.
Chargement:
Parce que vous avez le fichier. De la classe à charger nos applications, nous avons 2 routes, à partir de l'hypothèse que nous savons que le nom de la classe:
- Si nous ne disposons pas d'informations précises sur le déduire de classe à travers les mécanismes de réflexion et des méthodes d'instanciation;
- Si nous avons structuré le "plugin" d'implémenter une interface connue pour instancier un objet (comme nous allons le voir) et appeler les méthodes de l'interface.
2 I examinera le cas, car sinon trop de digressions sur un sujet qui est assez compliquée et la réflexion intéressante.
Prenons le cas suivant:
Classe A (celle que l'on veut charger) B implémente l'interface.
new ClassLoader ( ) ; ClassLoader loader = new ClassLoader (); gt ; cls = loader. loadClass ( "A" ) ; Class & lt;? & Gt; cls = chargeur. LoadClass ( "A"); B ) cls. newInstance ( ) ; Istanza_di_A B = (B) CLS. NewInstance (); ... ) ; istanza_di_A. metodoDiA (...); |
Comme vous pouvez voir le processus est très simple à mettre en œuvre, nous allons voir maintenant quelle est la principale limitation.
UnloadingReloading:
Malheureusement, la JVM ne permet pas le déchargement des classes chargées sur bytecode.
Envisager l'idée de modifier le code de la classe une fois après l'instanciation d'un objet de ce type dans notre programme. Nous souhaitons, comme cela semble naturel que, une fois chargé bytecode de la classe modifié et recompilé, les nouveaux objets de type "A" sont créées selon la dernière version disponible.
Malheureusement, cela ne fonctionne pas, on voit pourquoi.
Le chargeur de classes qui, auparavant, nous avions l'habitude de «charge» en mémoire de notre bytecode de classe à l'exécution, comme nous l'avons dit ne peut pas être (manuellement ou automatiquement) pour gérer le déchargement des classes instanciées par l'application. Au moment de la création d'un objet est simplement de suivre l'algorithme suivant (qui portent une très simplifié):
- Arrivée sur la structure de données (une table de hachage) s'il ya une entrée pour la classe qui lui a demandé de charger en allant avec le nom de classe ( "class_name" -> "bytecode");
- Si vous ne trouvez pas les entrées correspondantes dans le nom crée un, et, après la lecture du fichier. Classe, sauf le bytecode dans une telle structure, puis retourne une instance du programme.
- Alternativement, si vous trouvez une entrée pour le nom de classe, n'est pas concerné dans l'une des façons d'évaluer si le bytecode est mis à jour ou non; instancie un objet à partir du bytecode enregistré et envoyé au programme.
Comme vous pouvez donc imaginer les changements prendront effet que lorsque vous redémarrez le programme.
La seule solution existante est d'implémenter un classloader qui nous caricareistanziare cas portent sur les classes que nous voulons utiliser comme un plug-et que, une fois que tout changement se produit, on peut "jeter" (en mettant toutes ses références à null) reinstanziarene pour une nouvelle application qui prend soin de gérer le nouveau code dans sa structure de données privées.
Lourdeur vraie solution? Eh bien, s'il fait bien de mettre à jour le MENDEMENTS Tomcat JSP dirais qu'il est opportun d'adapter ![]()
Popularité: 19% [?]
Mots-clés: bytecode, ClassLoader, Compiler, Dynamic Loading, HotSwap, Java, JSP, JVM, Chargement, rechargement, le Runtime, Tomcat, Déchargement
leave a response , or trackback from your own site. Vous pouvez suivre les réponses à ce bulletin avec le 2.0 feed RSS. Vous pouvez laisser une réponse, ou un trackback depuis votre propre site.



![Ajoutez '[Java] Chargement dynamique' to Del.icio.us Aggiungi '[Java] Dynamic Loading' a Del.icio.us](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delicious.png)
![Ajoutez '[Java] Chargement dynamique' to digg Aggiungi '[Java] Dynamic Loading' a digg](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/digg.png)
![Ajoutez '[Java] Chargement dynamique' to FURL Aggiungi '[Java] Dynamic Loading' a FURL](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/furl.png)
![Ajoutez '[Java] Chargement dynamique' to blinklist Aggiungi '[Java] Dynamic Loading' a blinklist](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/blinklist.png)
![Ajoutez '[Java] Chargement dynamique' to reddit Aggiungi '[Java] Dynamic Loading' a reddit](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/reddit.png)
![Ajoutez '[Java] Chargement dynamique' à Feed Me Links Aggiungi '[Java] Dynamic Loading' a Feed Me Links](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/feedmelinks.png)
![Ajoutez '[Java] Chargement dynamique' to Technorati Aggiungi '[Java] Dynamic Loading' a Technorati](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technorati.png)
![Ajoutez '[Java] Web Dynamic Loading' a Yahoo My Aggiungi '[Java] Dynamic Loading' a Yahoo My Web](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png)
![Ajoutez '[Java] Chargement dynamique' to Socializer Aggiungi '[Java] Dynamic Loading' a Socializer](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/socializer.png)
![Ajoutez '[Java] Chargement dynamique' to Ma.gnolia Aggiungi '[Java] Dynamic Loading' a Ma.gnolia](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/magnolia.png)
![Ajoutez '[Java] Chargement dynamique' to Google Bookmarks Aggiungi '[Java] Dynamic Loading' a Google Bookmarks](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/google.png)
![Ajoutez '[Java] Chargement dynamique' to Bloglines Aggiungi '[Java] Dynamic Loading' a Bloglines](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bloglines.png)
![Ajoutez '[Java] Chargement dynamique' to Squidoo Aggiungi '[Java] Dynamic Loading' a OKnotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/oknotizie.gif)
![Ajoutez '[Java] Chargement dynamique' à Bookmark.it Aggiungi '[Java] Dynamic Loading' a Bookmark.it](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bookmark.png)
![Ajoutez '[Java] Chargement dynamique »de poser Aggiungi '[Java] Dynamic Loading' a Ask](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/ask.png)
![Ajoutez '[Java] Chargement dynamique à Delirious Aggiungi '[Java] Dynamic Loading' a Delirious](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delirious.png)
![Ajoutez '[Java] Chargement dynamique' a Live-MSN Aggiungi '[Java] Dynamic Loading' a Live-MSN](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/live.png)
![Ajoutez '[Java] Chargement dynamique à SlashDot Aggiungi '[Java] Dynamic Loading' a SlashDot](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/slashdot.png)
![Ajoutez '[Java] Chargement dynamique à Diggita Aggiungi '[Java] Dynamic Loading' a Diggita](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/diggita.png)
![Ajoutez '[Java] Chargement dynamique' to FaceBook Aggiungi '[Java] Dynamic Loading' a FaceBook](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/facebook.png)
![Ajoutez '[Java] Chargement dynamique' à Wikio Aggiungi '[Java] Dynamic Loading' a Wikio](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/wikio.png)
![Ajoutez '[Java] Chargement dynamique' à MySpace Aggiungi '[Java] Dynamic Loading' a MySpace](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/myspace.png)
![Ajoutez '[Java] Chargement dynamique' à Twitter Aggiungi '[Java] Dynamic Loading' a Twitter](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/twitter.png)
![Ajoutez '[Java] Chargement dynamique' to Tailrank Aggiungi '[Java] Dynamic Loading' a Technotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technotizie.png)
Laissez une réponse