217 votes

La différence entre le contexte du thread classe chargeur et chargeur de classe normale

Quelle est la différence entre un thread du contexte de la classe loader et un chargeur de classe normale? C'est, si Thread.currentThread().getContextClassLoader() et getClass().getClassLoader() de retour différents chargeur de classe d'objets, dont l'un sera utilisé?

134voto

David Roussel Points 2019

Chaque classe va utiliser son propre classloader pour charger d'autres classes. Donc, si ClassA.class références ClassB.class alors ClassB doit être dans le classpath du chargeur de classe ClassA, ou de ses parents.

Le contexte du thread chargeur de classe est le chargeur de classe actuel pour le thread courant. Un objet peut être créé à partir d'une classe en ClassLoaderC et ensuite transmis à un fil détenue par ClassLoaderD. Dans ce cas, l'objet doit utiliser Thread.currentThread().getContextClassLoader() directement, s'il veut charger les ressources qui ne sont pas disponibles sur son propre classloader.

85voto

mtim Points 1212

Il y a un article sur javaworld.com qui explique la différence => Qui ClassLoader devriez-vous utiliser

(1)

Contexte de Thread chargeurs de classes de fournir un porte arrière autour de la classloading délégation régime.

Prendre JNDI par exemple: ses tripes sont mis en œuvre par bootstrap des classes dans rt.jar (en commençant avec J2SE 1.3), mais ces JNDI classes de charge JNDI les fournisseurs mis en œuvre par indépendant les vendeurs et potentiellement déployé dans l'application est -classpath. Cette un scénario pour un parent chargeur de classe (le primordial dans ce cas) pour charger une classe visible l'un de ses enfants les chargeurs de classe (la système de l'une, par exemple). Normal J2SE la délégation ne fonctionne pas, et le solution de contournement est de rendre le noyau JNDI les classes de l'utilisation de la thread contexte des chargeurs,des donc effectivement de "tunneling" par le biais de le chargeur de classe de la hiérarchie dans l' direction opposée à la bonne délégation.

(2) de la même source:

Cette confusion va probablement rester avec Java pour un certain temps. Prendre toute J2SE API avec dynamique de chargement de ressources de tout genre et essayer de deviner qui de chargement la stratégie qu'il utilise. Voici un échantillon:

  • JNDI utilise le contexte chargeurs de classes
  • Classe.getResource() et de la Classe.forName() utiliser le chargeur de classe actuel
  • JAXP utilise le contexte chargeurs de classes (J2SE 1.4)
  • java.util.ResourceBundle utilise de l'appelant au courant du chargeur de classe
  • URL gestionnaires de protocole spécifié par java.le protocole.gestionnaire d'.pkgs système de propriété sont considérés dans le bootstrap et le système de chargeurs de classes uniquement
  • La Sérialisation Java API utilise de l'appelant au courant du chargeur de classe par défaut

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: