Ya hablamos sobre el hecho de que las clases son tipos de datos complejos. Ahora hablemos un poco sobre el otro lado de las clases: cómo la máquina Java maneja las clases. Recuerda que en Java todo es un objeto, incluso una clase. Una clase es un objeto. ¿Eso te sorprende? Entonces sigamos.
Cargando una clase en la memoria
En realidad, cuando se carga una clase en la memoria, se crean tres "objetos" especiales:
Breve descripción de la ilustración:
Rectángulo amarillo:
El archivo de código se almacena en el disco como un archivo con la extensión ".class". Contiene información sobre la clase, sus campos y métodos, así como el código fuente de los métodos compilados en bytecode.
Rectángulo naranja:
Cuando la máquina Java carga una clase en la memoria, compila el código de bytes en un código de máquina específico para el procesador y el sistema operativo de la computadora. Solo la máquina Java tiene acceso a este código de máquina. Como programadores de Java, no tenemos acceso a él.
Rectángulo verde:
La máquina Java crea un objeto que contiene todas las variables y métodos estáticos de la clase. Accede a este "objeto" usando el nombre de la clase.
Por ejemplo, cuando escribe , se refiere a la variable estática ubicada en la clase. Este objeto es nuestro rectángulo verde. Y ahí es donde se almacena la variable estática.java.lang.Math.PI
PI
java.lang.Math
java.lang.Math
PI
Rectángulo azul:
Cuando la máquina Java carga el código de una clase en la memoria, crea un java.lang.Class
objeto especial que almacena información sobre la clase cargada: su nombre, nombres de métodos, nombres y tipos de campos, etc.
El nombre "Clase" puede ser un poco confuso. Tendría más sentido llamarlo ClassInfo, ya que esta clase solo almacena información sobre la clase cargada.
Puede obtener el objeto Clase para cualquier tipo usando un comando como este:
Class name = ClassName.class;
Ejemplos:
Código | Nota |
---|---|
|
Obtener un Class objeto con información sobre la String clase. |
|
Obtener un Class objeto con información sobre la Object clase. |
|
Obtener un Class objeto con información sobre la Integer clase. |
|
Obtener un Class objeto con información sobre el int tipo. |
|
Obtener un Class objeto con información sobre el void tipo. |
También puede obtener una referencia a un objeto de descripción de clase desde cualquier objeto, ya que cada objeto tiene el getClass()
método, que hereda de la Object
clase.
Ejemplos:
Código | Nota |
---|---|
|
Mismo objeto queString.class |
|
Mismo objeto queInteger.class |
|
Mismo objeto queBoolean.class |
GO TO FULL VERSION