Question

Quelqu'un peut-il me diriger une bonne ressource ou me expliquer le concept derrière classe chargeurs? J'ai trouvé la ressource suivante sur les chargeurs de classes http://www.onjava.com/lpt/a/5586 mais toujours pas d'aide. Les questions suivantes peuvent sembler idiot, mais en essayant d'y répondre toujours me confond.

  • Pourquoi les développeurs écrivent les chargeurs de classes personnalisées, pourquoi ne pas invoquer un chargeur de classe Bootstrap pour appeler vos classes personnalisées? Quelle est la nécessité de définir les chargeurs de classes personnalisées?
  • Pourquoi il y a tant de variétés de chargeurs de classe? par exemple:. Bootsrap, Comman, Catalina chargeur de classe etc,

    Merci à l'avance.

Était-ce utile?

La solution

J'ai trouvé ce qui suit, des raisons valables pour créer classloaders personnalisés:

  1. Vous voulez charger une classe à partir d'une source non conventionnelle (par exemple, le bytecode pour une classe est stockée dans une base de données, à travers le réseau ou 0 et porté comme 1s par pidgeons - MessengerPidgeonClassLoader). Il y a quelques implémentations ClassLoader déjà dans l'API pour de tels cas, comme URLClassLoader .

  2. Vous devez définir une hiérarchie différente pour charger les classes. Les implémentations par défaut du délégué ClassLoader la recherche d'abord aux parents, puis ils essaient de charger la classe eux-mêmes. Peut-être que vous voulez une autre hiérarchie. Ceci est la raison pour laquelle OSGI et Eclipse ont ses propres classloaders comme les fichiers .mf Manifest définissent tous les types de chemins de hiérarchie étranges (buddy-classloading, par exemple). Tous Eclipse classloaders implémenter l'interface BundleClassLoader et ont un code supplémentaire pour trouver des ressources dans Eclipse Plugins.

  3. Vous devez faire une modification du bytecode. Peut-être que le bytecode est crypté, et vous unencrypt à la volée ( Non pas que cela aide, vraiment, mais il a été jugé ). Peut-être que vous voulez "patch" les classes chargées à la volée (A la JDO amélioration bytecode).

En utilisant un autre classloader que si vous avez besoin de décharger est nécessaire, le système des classes Classloader de la mémoire, ou pour charger des classes que pourrait changer leur définition à l'exécution. Un cas typique est une application qui génère une classe à la volée à partir d'un fichier XML, par exemple, et essaie ensuite de recharger cette classe. Une fois qu'une classe est dans le système Classloader, il n'y a aucun moyen de le décharger et une nouvelle définition.

Autres conseils

Une utilisation courante des classloaders est d'isoler un fichier JAR. Si vous avez une application qui utilise des plugins ( Eclipse , Maven 2 ), alors vous pouvez avoir cette situation: Plugin X a besoin jar A avec la version 1.0 du plugin Y en a besoin, mais le même pot version 2.0. X ne fonctionne pas avec la version 2.0, cependant.

Si vous avez classloaders, vous pouvez créer des partitions des classes (penser à des îles isolées reliées par des ponts minces, les ponts sont les classloaders). De cette façon, les classloaders peuvent contrôler ce que chaque plugin peut voir.

Lorsque l'extension X instancier une classe Foo, qui a des champs statiques, ce n'est pas un problème et il n'y aura pas un malentendu avec la classe « même » dans le plugin Y parce que chaque classloader va en effet créer sa propre instance de la classe foo. Vous avez alors deux classes en mémoire, où cl1.getName().equals(cl2.getName()) est true mais cl1.equals(cl2) est pas. Cela signifie que les cas de CL1 ne sont pas compatibles affectation aux instances de Cl2. Cela peut conduire à ClassCastExceptions étrange dire que org.project.Foo ne peut pas être attribué à org.project.Foo.

Tout comme avec les îles éloignées, les deux classes ne sont pas conscients que l'autre existe. Pensez clones humains qui sont nés et élevés sur les îles différentes. Du point de vue de la machine virtuelle, il n'y a pas de problème parce que les instances de la classe de type sont traités comme tout autre objet: Il peut y avoir plusieurs d'entre eux. Que vous pensez que certains d'entre eux sont « les mêmes » n'a pas d'importance à la machine virtuelle.

Une autre utilisation pour ce modèle est que vous pouvez vous débarrasser des classes chargées de cette façon: Assurez-vous que personne ne dispose d'un pointeur vers un objet créé à partir de classes chargées à partir d'un classloader puis oublier la classloader aussi. A la prochaine exécution du , toutes les classes chargées par ce classloader sont supprimés de la mémoire . Cela vous permet de « recharger » votre application sans avoir à redémarrer l'ensemble VM.

Vous ne pouvez pas passer devant la source première, dans des cas comme celui-ci. Si vous vraiment veulent la dope à l'intérieur, le noyau dur , lisez les bits correspondants de la spécification Java Virtual machine .

Un autre bon lien pour les chargeurs de classe java - Java classloaders

Il est extrêmement rare que vous devez créer votre propre ClassLoader. Et genereally si vous avez besoin, vous devriez déjà avoir une très bonne compréhension de ce que le fait ClassLoader.

En d'autres termes, si vous vous demandez pourquoi vous devez créer votre propre ClassLoader, alors vous n'avez pas besoin de créer un;)

Cela étant dit, je l'ai aussi vu un ClassLoader en cours de création pour une application qui traitait de la cryptographie. De cette façon, chaque fois que vous créez un java.netSocket ou une sorte d'objet fichier / flux, au lieu d'utiliser les versions JVM qu'il utiliserait leurs propres personnalisés classes spéciales construites. De cette façon, ils pourraient garantir que toutes les informations ont été chiffrées et qu'il n'y avait pas d'erreurs de développement.

Mais ce n'est pas très courant. Vous pouvez aller toute une carrière Java sans jamais avoir besoin de créer votre propre ClassLoader personnalisé. En fait, si vous avez besoin pour créer un, vous devriez vraiment demander s'il est nécessaire.

  

Pourquoi les développeurs écrivent les chargeurs de classes personnalisées, pourquoi ne pas appeler un chargeur de classe Bootstrap pour appeler vos classes personnalisées? Quelle est la nécessité de définir des chargeurs de classe personnalisée?

En fonction de l'application, les développeurs pourraient remplacer ou remplacer complètement le mécanisme de chargement de classe pour répondre à leurs besoins.

Par exemple, j'ai utilisé une application dont les classes sont chargées à partir d'un LDAP: S

D'autres applications ont besoin de gérer de classe indépendante (comme la plupart des serveurs d'applications qui prennent en charge-chaud) Déployez

A propos des ressources, il y a TONNES, dans le web, qui ne peut simplement pas être répertorié.

Un exemple:

Tomcat utiliser WebAppClassloader sur mesure pour charger et isoler les classes / pots de différentes applications Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top