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:
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.PI
PI
java.lang.Math
java.lang.Math
PI
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 |
---|---|
|
Obter um Class objeto com informações sobre a String classe |
|
Obter um Class objeto com informações sobre a Object classe |
|
Obter um Class objeto com informações sobre a Integer classe |
|
Obter um Class objeto com informações sobre o int tipo |
|
Obter um Class objeto com informações sobre o void tipo |
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 Object
classe.
Exemplos:
Código | Observação |
---|---|
|
Mesmo objeto queString.class |
|
Mesmo objeto queInteger.class |
|
Mesmo objeto queBoolean.class |
GO TO FULL VERSION