Carregador de classe
O carregador de classe Java deve carregar dinamicamente as classes necessárias na JVM em tempo de execução. O carregador de classe Java é baseado em três mecanismos: delegado, visível e único.
Carregue os arquivos .class sob o caminho de classe na memória e processe -os no bytecode. Essas tarefas são realizadas pelo carregador de classe.
Carregador de classe padrão
O sistema padrão é de três carregadeiras de classe:
O carregador de classe também é uma classe Java, mas o bootstrap não é. Código de verificação:
classe pública classeLoadetest {public static void main (string [] args) {System.out.println (System.class.getClassLoadeler ()); }}Saída: NULL
If System.out.println (System.class.getClassloader (). ToString); é usado, uma exceção de ponteiro nulo é relatada:
Exceção no thread "main" java.lang.nullpointerException em com.iot.classloader.classLoadestest.main (classeLoadetest.java:10) em sun.reflect.nativemethodaccessorimpl.invoke0 (método nativo) em sun.reflelect.nativeMethodAccessorImpl.invoke (nativemethodaccessorimpl.java:62) em sun.reflelect.delegatingMethodAccessorImpl.invake (delegatingMethodAccessorImpl.java:43) em java.lang.reflectMethMethMethMetM. com.intellij.rt.execution.application.appmain.main (appmain.java:144)
Como pode ser visto, a classe do sistema é carregada pelo carregador de classe de bootstrap.
Mecanismo de delegado de carregador de classe
Diagrama de árvores do carregador de classe
Carregador de classe
A Ordem Geral das Classes de Carregamento:
Como escrever um carregador de classe personalizado
API:
Classe de classe
Modelo Method Design Pattern
Classe dos pais:
Classe de carga (processo de carregamento de classe, modelo)
FindClass Classe Carregando lógica para substituições de subclasse chamadas pelo método de carga de carga.
DefinClass Get Arquivo de classe convertido em bytecode
Subclasse: substituir o método FindClass
exemplo:
O código -fonte do método de carga de carga
Classe protegida <?> loadclass (nome da string, resolução booleana) lança ClassNotFoundException {Synchronized (getClassLoadingLock (name)) {// primeiro, verifique se a classe já foi carregada classe <?> c = findloadClass (nome); if (c == null) {long t0 = System.nanotime (); tente {if (parent! = null) {c = parent.loadclass (nome, false); } else {c = findBootStrapClassornull (nome); }} catch (classNotFoundException e) {// classNotfoundException arremessado se a classe não encontrada // da classe pai não null carregador} if (c == null) {// Se ainda não for encontrado, invoce findClass em ordem // para encontrar a classe. T1 longo = System.Nanotime (); c = findClass (nome); // Este é o carregador de classe definidor; registre as estatísticas sol.misc.perfcounter.getParentDelegationTime (). Addtime (t1 - t0); Sun.misc.perfcounter.getfindclasSTime (). addelapSedTimeFrom (T1); sun.misc.perfcounter.getfindClasses (). increment (); }} if (resolve) {resolveclass (c); } retornar c; }}Exemplos na documentação da API:
classe NetworkClassLoader estende o classelloader {String host; int porta; classe pública FindClass (nome da string) {byte [] b = loadclassData (nome); retornar definitivamenteClass (nome, b, 0, b.Length); } byte privado [] loadclassData (nome da string) {// carrega os dados da classe da conexão. . . }}