Por que usar um carregador de classe?
No idioma Java, o carregamento da classe é concluído durante a operação do programa. Embora essa estratégia aumentará ligeiramente a sobrecarga de desempenho ao carregar a classe, ela fornecerá aos aplicativos Java um alto grau de flexibilidade. Por exemplo:
1. Escreva um aplicativo orientado à interface e pode esperar até que ele seja executado antes de especificar sua subclasse de implementação;
2. Os usuários podem personalizar um carregador de classe, permitindo que o programa carregue um fluxo binário da rede ou de outros locais como parte do código do programa em tempo de execução; (Esta é a base do plug-in Android, instalação dinâmica e atualização do APK)
Por que estudar todo o processo de carregamento de classe?
Mecanismo de carregamento de classe
A JVM carrega o arquivo de classe na memória e verifica, analisa e inicializa os dados e, finalmente, forma todo o processo do tipo Java que a JVM pode usar diretamente.
carregar
Carregue o conteúdo do bytecode do arquivo de classe na memória e converta os dados estáticos em uma estrutura de dados de tempo de execução na área de métodos e gerar um objeto java.lang.Class que representa essa classe na pilha, como o portal de acesso para os dados da classe da área de métodos. Esse processo requer a participação do carregador de classe.
Link
O processo de combinar o código binário da classe Java no estado de corrida da JVM
inicialização
<clinit>() . O método do construtor de classe <clinit>() é gerado pelo compilador coletando automaticamente as ações de atribuição de todas as variáveis de classe na classe e a mesclagem de declarações no bloco de declaração estática (bloco estático).<clinit>() de uma classe seja corretamente bloqueado e sincronizado em um ambiente multithread.Exemplo 1:
classe pública Demo01 {public static void main (string [] args) {a a = new a (); System.out.println (A.Width); }} classe A {public static int width = 100; // variável estática, campo estático estático estático {System.out.println ("Classe de inicialização estática A"); largura = 300; } public a () {System.out.println ("Crie um objeto de classe A"); }}analisar:
ilustrar:
Existem pilhas, pilhas (locais criados) e áreas de método na memória (na verdade um heap especial)
1. Quando o JVM carrega o Demo01, primeiro forma os dados estáticos (variáveis de classe, métodos de classe, código ...) na área do método. Ao mesmo tempo, um objeto java.lang.Class (objeto reflexivo) será formado na pilha, representando a classe Demo01. Através do objeto, a estrutura binária de classe pode ser acessada. Em seguida, carregue as informações da Classe A variável e também forme um objeto A na pilha, representando a classe A.
2. Quando o método principal é executado, o quadro principal da pilha de métodos será formado na pilha e um método corresponde a um quadro de pilha. Se o método principal chamar outros métodos, ele o pressionará um por um na pilha. Existe uma variável local A tipo A no método principal. No início, o valor de A é nulo. O construtor da Classe A é chamado através de novo. O método a () é gerado na pilha e o objeto A é gerado na pilha. Em seguida, o endereço de objeto A é pago a A na pilha. Neste momento, a tem o endereço de objeto A.
3. Quando a largura é chamada, os dados da área de método são chamados.
Quando uma classe é carregada por referência, a classe só será carregada uma vez
Referência ativa da classe (a inicialização da classe ocorrerá definitivamente)
java.lang.reflect para fazer chamadas de reflexão para a classe Referência passiva à classe (a inicialização da classe não ocorrerá)
Exemplo 2:
public class Demo01 {static {System.out.println ("Demoção de inicialização estática"); } public static void main (string [] args) lança exceção {System.out.println ("Método principal da Demo01!"); System.out.println (System.getProperty ("java.class.path")); // referência ativa // new a (); // system.out.println (a.width); // class.formoname ("com.sinosoft.test.a"); // referência passiva // system.out.println (a.max); // a [] como = novo a [10]; System.out.println (b.width); // classe b não será carregado}} classe B estende A {static {System.out.println ("Inicialização estática B"); }} classe A estende a_father {public static int width = 100; // variável estática, campo estático de campo estático estático final int max = 100; static {System.out.println ("Classe de inicialização estática A"); largura = 300; } public a () {System.out.println ("Crie um objeto de classe A"); }} classe a_father estende o objeto {static {System.out.println ("Inicialização estática a_father"); }}Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.