Fases de carga de clases: carga, enlace e inicialización
Recorra las fases de carga, verificación, preparación, resolución e inicialización de las clases.
Fases de carga de clases: carga, enlace e inicialización es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
El ciclo de vida de carga de clases
Una clase de Java atraviesa tres fases antes de poder utilizarse: carga (buscar y leer el bytecode), enlazado (verificar, preparar y resolver) e inicialización (ejecutar los inicializadores estáticos).
Fase 1: carga
El ClassLoader lee el archivo .class (del sistema de archivos, un JAR, la red o bytecode generado) y crea en el heap un objeto Class<?> que lo representa.
// Trigger loading explicitly:
Class<?> c = Class.forName("com.example.MyService");
// The JVM delegates to the appropriate ClassLoader to find and load MyService.classFase 2a: verificación
El verificador de bytecode comprueba que el bytecode cargado sea estructuralmente válido, seguro en cuanto a tipos y conforme a las reglas de la especificación de la JVM. Un bytecode no válido (por ejemplo, manipulado incorrectamente con ASM) provoca un VerifyError.
Fase 2b: preparación
La JVM asigna memoria para los campos estáticos y les asigna sus valores predeterminados (0, false, null). En esta fase, los inicializadores estáticos TODAVÍA no se han ejecutado.
public class Config {
static int timeout = 30; // after preparation: timeout = 0 (default)
static String host = "db"; // after preparation: host = null
// Both get their real values only after Initialization
}Fase 2c: resolución
Las referencias simbólicas (nombres de clases y firmas de métodos) del conjunto de constantes se reemplazan por referencias directas (punteros) a las clases y métodos reales. Este proceso puede posponerse (resolución diferida).
Fase 3: inicialización
Los inicializadores estáticos (bloques static {}) y las asignaciones de campos estáticos se ejecutan en el orden textual. Es en este momento cuando se ejecutan realmente timeout = 30 y host = "db".
public class Config {
static int timeout;
static String host;
static {
timeout = Integer.parseInt(System.getenv("TIMEOUT"));
host = System.getenv("DB_HOST");
System.out.println("Config initialized");
}
}Desencadenantes de la inicialización de clases
La inicialización se ejecuta por primera vez en los siguientes casos: (1) creación de una instancia, (2) acceso a un campo estático (no constante), (3) llamada a un método estático, (4) reflexión mediante Class.forName() (con initialize=true) y (5) inicialización de una subclase.
// forName with initialize=false skips static initializers:
Class<?> c = Class.forName("com.example.MyService", false, loader);El método <clinit>
La JVM genera un método <clinit> (inicializador de clase) a partir de todos los inicializadores estáticos y las asignaciones de campos estáticos. Se ejecuta exactamente una vez y es seguro para subprocesos: la JVM garantiza la exclusión mutua.
ExceptionInInitializerError
Si un inicializador estático lanza una excepción, la JVM la envuelve en ExceptionInInitializerError. Los intentos posteriores de utilizar la clase lanzan NoClassDefFoundError.
static {
if (System.getenv("DB_URL") == null)
throw new RuntimeException("DB_URL not set"); // wrapped in ExceptionInInitializerError
}Orden de inicialización estática
Los inicializadores estáticos se ejecutan en el orden en que aparecen en el código. Las dependencias circulares entre clases durante la inicialización pueden provocar que queden parcialmente inicializadas, un problema conocido del patrón Initialization-on-Demand Holder.
class A {
static final int X = B.Y + 1; // accesses B before B is initialized!
}
class B {
static final int Y = A.X + 1; // circular!
}Observación de la carga de clases
Habilite el registro de carga de clases con -Xlog:class+load=info (JVM 9 o posterior) para ver qué clases se cargan, desde dónde y mediante qué ClassLoader.
// JVM flag:
// java -Xlog:class+load=info:file=classload.log MyApp
// Output lines like:
// [info][class,load] com.example.MyService source: file:///app/app.jarComprobación rápida
¿Durante qué fase se ejecutan los inicializadores estáticos?
Resumen
Cargar: leer el bytecode. Enlazar: verificar → preparar (valores cero predeterminados) → resolver (referencias simbólicas). Inicializar: ejecutar <clinit>. La inicialización se desencadena con el primer uso y es segura para subprocesos. Las dependencias circulares durante la inicialización provocan errores sutiles.
Preguntas frecuentes
¿La lección «Fases de carga de clases: carga, enlace e inicialización» es gratis?
Sí — el texto completo de «Fases de carga de clases: carga, enlace e inicialización» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Fases de carga de clases: carga, enlace e inicialización»?
Recorra las fases de carga, verificación, preparación, resolución e inicialización de las clases. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Fases de carga de clases: carga, enlace e inicialización»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fases de carga de clases: carga, enlace e inicialización
- Jerarquía de ClassLoader y cargadores personalizados
- Inspección del bytecode con javap
- Compilación JIT y compilación por niveles