0Pricing
Java Academy · Lección

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.class

Fase 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.jar

Comprobació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

  1. Fases de carga de clases: carga, enlace e inicialización
  2. Jerarquía de ClassLoader y cargadores personalizados
  3. Inspección del bytecode con javap
  4. Compilación JIT y compilación por niveles
← Volver a Java Academy