Chargeur de classe
Le chargeur de classe Java doit charger dynamiquement les classes requises dans le JVM à l'exécution. Le chargeur de classe Java est basé sur trois mécanismes: délégué, visible et célibataire.
Chargez les fichiers .class sous le chemin de classe dans la mémoire et traitez-les en bytecode. Ces tâches sont effectuées par le chargeur de classe.
Chargeur de classe par défaut
Le système est par défaut à trois chargeurs de classe:
Le chargeur de classe est également une classe Java, mais Bootstrap ne l'est pas. Le code de vérification:
public class classloaderTest {public static void main (String [] args) {System.out.println (System.class.getClassloader ()); }}Sortie: nul
If System.out.println (System.Class.getClassOLODOFer (). TOSTRING); est utilisé, une exception du pointeur nul est signalée:
Exception dans Thread "Main" java.lang.nullpointerException à com.iot.classloader.classloaderTest.main (classloaderTest.java:10) sur sun.reflect.nativemethodaccessorimp.invoke0 (méthode native) sur Sun.Reflect.NativeMethodAccessOrimpl.invoke (nativemethodaccessorimp.java:62) à Sun.Reflect.delegatingMethodaccessorimp.invoke (déléguantMethodAccessOrimpl com.intellij.rt.execution.application.appmain.main (appmain.java:144)
Comme on peut le voir, la classe système est chargée par le chargeur de classe bootstrap.
Mécanisme de délégué du chargeur de classe
Diagramme d'arbre du chargeur de classe
Chargeur de classe
L'ordre général des classes de chargement:
Comment rédiger un chargeur de classe personnalisé
API:
Class Classloader
Modèle de conception de méthode du modèle
Classe parent:
LoadClass (processus de chargement de classe, modèle)
FindClass Class Logic Logic pour les remplacements de sous-classe appelés par méthode LoadClass.
DefinClass Get Class Fichier Converti en ByteCode
Sous-classe: remplacer la méthode FindClass
exemple:
Le code source de la méthode de charge de chargement
Class protégé <?> LoadClass (String Name, Boolean Resolve) lève ClassNotFoundException {Synchronized (getClassloadingLock (name)) {// Tout d'abord, vérifiez si la classe a déjà été la classe chargée <?> C = findloadClass (name); if (c == null) {long t0 = System.NanoTime (); essayez {if (parent! = null) {c = parent.loadClass (name, false); } else {c = findbootstrapClassorNull (name); }} catch (classNotFoundException e) {// classNotFoundException lancé si la classe n'est pas trouvée // à partir du chargeur de classe parent non nulle} if (c == null) {// Si non trouvé, alors invoquez laclasse dans l'ordre // pour trouver la classe. long t1 = System.NanoTime (); c = findClass (name); // c'est le chargeur de classe déterminant; Enregistrez les statistiques Sun.Misc.PerfCounter.GetParentDelegationTime (). AddTime (T1 - T0); Sun.Misc.PerfCounter.getFindCLasStime (). AddElapSedTimeFrom (T1); Sun.Misc.perfcounter.getFindClasses (). Incmenment (); }} if (résolve) {résolveclass (c); } return c; }}Exemples dans la documentation de l'API:
class NetworkClassLoader étend classloadher {String host; port int; classe publique findClass (String name) {byte [] b = loadclassData (name); return Deficlass (nom, b, 0, b.length); } octet privé [] LoadClassData (nom de chaîne) {// Chargez les données de classe à partir de la connexion. . . }}