Já falamos sobre o fato de que as classes são tipos de dados complexos. Agora vamos falar um pouco sobre o outro lado das classes — como as classes são manipuladas pela máquina Java. Lembre-se que em Java tudo é um objeto, até mesmo uma classe. Uma classe é um objeto. Isso te surpreende? Então vamos continuar.

Carregando uma classe na memória

Na verdade, quando uma classe é carregada na memória, três "objetos" especiais são criados:

Carregando uma classe na memória

Breve descrição da ilustração:

retângulo amarelo:

O arquivo de código é armazenado em disco como um arquivo com a extensão ".class". Ele contém informações sobre a classe, seus campos e métodos, bem como o código-fonte dos métodos compilados em bytecode.

retângulo laranja:

Quando a máquina Java carrega uma classe na memória, ela compila o bytecode em código de máquina específico para o processador e sistema operacional do computador. Apenas a máquina Java tem acesso a este código de máquina. Como programadores Java, não temos acesso a ele.

retângulo verde:

A máquina Java cria um objeto que contém todas as variáveis ​​estáticas e métodos da classe. Você acessa esse "objeto" usando o nome da classe.

Por exemplo, ao escrever , você está se referindo à variável estática localizada na classe. Este objeto é o nosso retângulo verde. E é aí que a variável estática é armazenada.java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

retângulo azul:

Quando a máquina Java carrega o código de uma classe na memória, ela cria um objeto especial java.lang.Class, que armazena informações sobre a classe carregada: seu nome, nomes de métodos, nomes de campos e tipos, etc.

O nome "Classe" pode ser um pouco confuso. Faria mais sentido chamá-la de ClassInfo, já que esta classe apenas armazena algumas informações sobre a classe carregada.

Você pode obter o objeto Class para qualquer tipo usando um comando como este:

Class name = ClassName.class;

Exemplos:

Código Observação
Class a = String.class;
Obter um Classobjeto com informações sobre a Stringclasse
Class b = Object.class;
Obter um Classobjeto com informações sobre a Objectclasse
Class c = Integer.class;
Obter um Classobjeto com informações sobre a Integerclasse
Class d = int.class;
Obter um Classobjeto com informações sobre o inttipo
Class e = void.class;
Obter um Classobjeto com informações sobre o voidtipo

Você também pode obter uma referência a um objeto de descrição de classe de qualquer objeto, pois cada objeto possui o getClass()método, que herda da Objectclasse.

Exemplos:

Código Observação
Class a = "Hello".getClass();
Mesmo objeto queString.class
Class b = new Integer().getClass();
Mesmo objeto queInteger.class
Class c = Boolean.TRUE.getClass();
Mesmo objeto queBoolean.class