Parlez de tous les aspects liés au chargement des classes Java

Qu'est-ce qu'un chargeur de classe

Le chargeur de classe est un module qui charge la description de la classe dans la mémoire de la machine virtuelle; la description typique de la classe est le fichier de classe compilé à partir du code source java, et il peut également être dans tout autre format de données, tel sous forme de flux d'octets réseau;

Quels sont les chargeurs de classe

Java définit trois types de chargeurs par défaut:

1. Le Bootstrap Class-Loader (Bootstrap Class-Loade) charge principalement le package jar sous jre / lib.
2. L'extension ou Ext Class-Loader (Extension ou Ext Class-Loader) charge principalement le package jar sous jre / lib / ext / directory; Le répertoire jre / lib / ext / peut être remplacé en spécifiant java.ext.dirs)
3. Application ou App Class-Loader, qui charge le contenu du classpath (classPath est un ensemble de combinaisons de répertoires).
Le chargeur de classe d'application peut être "remplacé". Le chargeur de classe d'application d'origine peut être remplacé par le paramètre entier de -Djava.system.class.loader = com.yourcorp.YourClassLoader; les guillemets doubles sont ajoutés dans l'écrasement, qui est en fait Le chargeur de classe défini sera appelé le père du chargeur de classe d'application par défaut;

Ceci est généralement effectué lorsque le modèle de délégation parent doit être modifié; pour le modèle de délégation parent, voir ci-dessous;

Modèle de délégation parent du chargeur de classe

Quel est le modèle de délégation parent

Lorsque le chargeur de classe essaie de charger un certain type, à moins que le chargeur parent ne puisse trouver le type correspondant, essayez de déléguer cette tâche au chargeur parent du chargeur actuel. Le but de l'utilisation du modèle de délégation est d'éviter le chargement répété de types Java

Pourquoi adopter le modèle de délégation des parents

L'adoption du modèle de délégation parentale repose principalement sur deux considérations:

Pour garantir l'unicité de la classe, une classe n'est chargée qu'une seule fois pour éviter un chargement répété; (car dans la spécification JVM, le même fichier de classe est chargé par deux mêmes classes, il sera considéré comme deux classes)
sécurité, pour assurer le le noyau de l'API java n'est pas remplacé, c'est-à-dire que les classes chargées par le chargeur de classe de démarrage ne seront pas écrasées par un autre chargeur de classe;

Qu'est-ce qui brise le modèle de délégation parentale et pourquoi

Service JNDI Mise à jour à chaud de l'implémentation OSGI du
serveur Tomcat La raison pour laquelle le scénario ci-dessus rompt le modèle de délégation parentale est que la classe parente ne peut pas charger ou exécuter une partie de la logique requise. le chargeur de sous-classe pour le chargement;

Le processus de chargement de classe

Le chargement de classe est principalement divisé en trois processus, chargement, liaison et initialisation;

Chargement : Java lit les données bytecode de différentes sources de données dans la JVM et les mappe à une structure de données (objet de classe) reconnue par la JVM

Lien : Il s'agit de l'étape principale. En termes simples, les informations de définition de classe d'origine sont facilement transformées en processus d'exécution JVM. Plus précisément, il est divisé en trois processus: vérification, préparation et analyse;

Vérification: vérifiez que l'objet de classe est conforme aux spécifications de la machine virtuelle.
Préparation: créez des variables statiques et préparez l'espace mémoire.
Analyse: modifiez les références de symboles dans le pool de constantes en références directes.
Initialisation : exécutez la logique d'initialisation de la classe, y compris statique affectation de champ, initialisation de bloc statique, etc.; L'initialisation du type parent est prioritaire sur le type courant.

Quels sont les scénarios d'application du chargeur de classe personnalisé

Modifiez la logique du bytecode de la classe, par exemple: tissage uniforme de la logique générale pour les classes externes;
création dynamique de classes en fonction des besoins de l'utilisateur; par exemple: classes de pilotes JDBC, différentes bases de données doivent utiliser différents
noms de package de classe de pilote + noms de classe en conflit Lorsqu'un le chargeur de classe ne peut pas être chargé en même temps, il peut être chargé dans la mémoire avec un chargeur de classe différent; la
fonction de mise à jour à chaud, via un chargeur de classe personnalisé, réalise le chargement et le déchargement dynamiques des classes pendant le fonctionnement

Implémentation du chargeur de classe personnalisé

Le cœur principal réside dans la phase d'obtention du bytecode de la classe.Pour mapper le bytecode à l'objet Class, cette partie n'est généralement pas impliquée;

public class CustomClassLoader extends ClassLoader {
    
    
 
    @Override
    public Class findClass(String name) throws ClassNotFoundException {
    
    
        byte[] b = loadClassFromFile(name); //这里是核心逻辑
        return defineClass(name, b, 0, b.length);
    }
 
    private byte[] loadClassFromFile(String fileName)  {
    
    
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
                fileName.replace('.', File.separatorChar) + ".class");
        byte[] buffer;
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        int nextValue = 0;
        try {
    
    
            while ( (nextValue = inputStream.read()) != -1 ) {
    
    
                byteStream.write(nextValue);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        buffer = byteStream.toByteArray();
        return buffer;
    }
}

sommaire

Aujourd'hui, j'ai partagé avec vous les connaissances suivantes sur le chargeur de classe Java:

1. Qu'est-ce qu'un chargeur de classe
? 2. Quels sont les chargeurs de classe spécifiques?
3. Le modèle de délégation parent
lors du chargement de classe. 4. Le processus spécifique de
chargement de classe. 5. Les scénarios d'application du chargeur de classe personnalisé.
6. La réalisation du chargeur de classe.

Apprenez la programmation Java sans fondement, vous pouvez rejoindre mon domaine d'apprentissage Java de dix ans . Echanges techniques, partage de ressources, réponse aux questions et résumé de l'expérience de développement.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_49794051/article/details/112982918
conseillé
Classement