Le premier chargeur de classe de la machine virtuelle Java est Bootstrap. Ce chargeur est imbriqué dans le noyau de la machine virtuelle Java. Il s'agit d'un code binaire (et non de bytecode) écrit en C++.
En utilisant le mécanisme de délégation, la classe parent sera recherchée de manière récursive, c'est-à-dire qu'il est préférable d'utiliser Bootstrap pour essayer de charger, et si elle n'est pas trouvée, descendre. Empêcher deux copies du bytecode d'apparaître en mémoire.
Vous avez mal compris Class et ClassLoader.
Lorsqu'une classe est enregistrée, utilisez d'abord le chargeur de classe du thread actuel pour charger la première classe du fil. Par exemple, cette classe est ClassA et le chargeur de classe est ClassLoaderA.
Si ClassA fait référence à ClassB, le système utilisera ClassLoaderA pour charger ClassB.
Maintenant, il y a 2 classes (version simplifiée, en fait plus de 2 classes).
Considérons une situation dans laquelle ClassX et ClassY ont été chargés en mémoire, et ils font tous deux référence à ClassZ. Alors, qui charge ClassZ ?
Évidemment, selon les étapes de chargement décrites ci-dessus, 2 copies de ClassZ apparaîtront : ClassX est chargé une fois, et ClassY est chargé à nouveau. Parce que ClassY ne sait pas que ClassX a été chargé.
Comment résoudre ce problème consiste à effectuer une recherche récursive dans la classe parent.
Les étapes spécifiques consistent à d'abord rechercher à partir de BootstrapClassLoader. Si BootstrapClassLoader a chargé cette classe, renvoyez-la. Si BootstrapClassLoader n'a pas chargé cette classe, continuez la recherche jusqu'à ce qu'il trouve cette classe. Si le chargeur de classe de ce thread n'est pas trouvé, cela signifie que la classe n'a pas été chargée et le chargeur du thread actuel est utilisé pour la charger. Vous pouvez utiliser getContextClassLoader() pour obtenir le chargeur de classe du thread actuel.
Il existe deux types de chargeurs de classes en Java : les chargeurs de classes système et les chargeurs de classes définis par l'utilisateur.
Le chargeur de classe système aura des restrictions de chemin de chargement. Par exemple, Bootstrap Class Loader sous JDK1.6, vous pouvez obtenir le chemin de chargement de classe via System.getProperty("sun.boot.class.path")
Les classes sous ces chemins sont gérées par Bootstrap. Si les classes sous d'autres chemins sont récurrées vers Bootstrap et que le fichier de classe est introuvable, le chargeur de classe de niveau suivant le chargera dans le chemin correspondant.
Le premier chargeur de classe de la machine virtuelle Java est Bootstrap. Ce chargeur est imbriqué dans le noyau de la machine virtuelle Java. Il s'agit d'un code binaire (et non de bytecode) écrit en C++.
En utilisant le mécanisme de délégation, la classe parent sera recherchée de manière récursive, c'est-à-dire qu'il est préférable d'utiliser Bootstrap pour essayer de charger, et si elle n'est pas trouvée, descendre. Empêcher deux copies du bytecode d'apparaître en mémoire.
Vous avez mal compris Class et ClassLoader.
Lorsqu'une classe est enregistrée, utilisez d'abord le chargeur de classe du thread actuel pour charger la première classe du fil. Par exemple, cette classe est ClassA et le chargeur de classe est ClassLoaderA.
Si ClassA fait référence à ClassB, le système utilisera ClassLoaderA pour charger ClassB.
Maintenant, il y a 2 classes (version simplifiée, en fait plus de 2 classes).
Considérons une situation dans laquelle ClassX et ClassY ont été chargés en mémoire, et ils font tous deux référence à ClassZ. Alors, qui charge ClassZ ?
Évidemment, selon les étapes de chargement décrites ci-dessus, 2 copies de ClassZ apparaîtront : ClassX est chargé une fois, et ClassY est chargé à nouveau. Parce que ClassY ne sait pas que ClassX a été chargé.
Comment résoudre ce problème consiste à effectuer une recherche récursive dans la classe parent.
Les étapes spécifiques consistent à d'abord rechercher à partir de BootstrapClassLoader. Si BootstrapClassLoader a chargé cette classe, renvoyez-la. Si BootstrapClassLoader n'a pas chargé cette classe, continuez la recherche jusqu'à ce qu'il trouve cette classe. Si le chargeur de classe de ce thread n'est pas trouvé, cela signifie que la classe n'a pas été chargée et le chargeur du thread actuel est utilisé pour la charger. Vous pouvez utiliser
getContextClassLoader()
pour obtenir le chargeur de classe du thread actuel.Il existe deux types de chargeurs de classes en Java : les chargeurs de classes système et les chargeurs de classes définis par l'utilisateur.
Le chargeur de classe système aura des restrictions de chemin de chargement. Par exemple,
.Bootstrap Class Loader
sous JDK1.6, vous pouvez obtenir le chemin de chargement de classevia
System.getProperty("sun.boot.class.path")
Les classes sous ces chemins sont gérées par
Bootstrap
. Si les classes sous d'autres chemins sont récurrées versBootstrap
et que le fichier de classe est introuvable, le chargeur de classe de niveau suivant le chargera dans le chemin correspondant.Ce que la personne ci-dessus a dit est vrai, je vous suggère de lire des livres liés à JVM pour en savoir plus.