Maison  >  Questions et réponses  >  le corps du texte

java - 所有类都是由Object类的记载器加载的吗?

看到网上这么说:

双亲委派机制描述
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

首先将加载任务委托给父类加载器,依次递归 这句话的意思是所有类都是由Object类的记载器加载的吗?

大家讲道理大家讲道理2744 Il y a quelques jours601

répondre à tous(3)je répondrai

  • 大家讲道理

    大家讲道理2017-04-18 10:50:25

    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.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-18 10:50:25

    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")

    .
    JAVA_HOME\jre6\lib\resources.jar;  
    JAVA_HOME\Java\jre6\lib\rt.jar;  
    JAVA_HOME\jre6\lib\sunrsasign.jar;  
    JAVA_HOME\jre6\lib\jsse.jar;JAVA_HOME\jre6\lib\jce.jar;  
    JAVA_HOME\jre6\lib\charsets.jar;  
    JAVA_HOME\jre6\lib\modules\jdk.boot.jar;  
    JAVA_HOME\jre6\classes 

    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.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:50:25

    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.

    répondre
    0
  • Annulerrépondre