0Pricing
Java Academy · Lección

Jerarquía de ClassLoader y cargadores personalizados

Comprenda los cargadores de clases de arranque, de plataforma y de aplicación, y escriba un ClassLoader personalizado.

Jerarquía de ClassLoader y cargadores personalizados es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 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.

La jerarquía de ClassLoader

La JVM utiliza una jerarquía de ClassLoader. Cada cargador tiene un padre; antes de intentar cargar una clase por sí mismo, delega la tarea en su padre (modelo de delegación primero al padre).

Bootstrap ClassLoader

Bootstrap ClassLoader carga las clases principales del JDK (java.lang.*, java.util.*). Está implementado en código nativo y no tiene un padre Java; getParent() devuelve null.

ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)

Platform ClassLoader (Java 9 o posterior)

Platform ClassLoader (antes denominado Extension ClassLoader) carga módulos del JDK que no forman parte del conjunto de Bootstrap (java.sql, java.xml, etc.). Su padre es Bootstrap ClassLoader.

ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoader

Application (System) ClassLoader

Application ClassLoader carga las clases de la aplicación desde el classpath (-cp / CLASSPATH). Su padre es Platform ClassLoader. Es el cargador predeterminado para el código del usuario.

ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoader

Delegación primero al padre

Al cargar com.example.MyService, AppClassLoader pregunta primero a su padre (Platform), que a su vez pregunta a Bootstrap. Solo si ninguno de los padres puede cargarla, el hijo intenta cargarla por sí mismo.

Identidad de las clases y ClassLoader

Dos clases con el mismo nombre cargadas por ClassLoader diferentes se consideran tipos distintos. Intentar convertir una en la otra lanza ClassCastException, algo importante en los sistemas de complementos y en OSGi.

// Loaded by two different loaders → different Class objects
Class<?> c1 = loader1.loadClass("com.example.Plugin");
Class<?> c2 = loader2.loadClass("com.example.Plugin");
System.out.println(c1 == c2); // false!

Escritura de un ClassLoader personalizado

Extienda ClassLoader y sobrescriba findClass(String name). Lea el bytecode desde un origen personalizado (un JAR cifrado, la red o una base de datos) y llame a defineClass.

public class EncryptedClassLoader extends ClassLoader {
    public EncryptedClassLoader(ClassLoader parent) { super(parent); }
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] bytes = decrypt(readBytecodeFromVault(name));
        return defineClass(name, bytes, 0, bytes.length);
    }
}

URL ClassLoader: carga desde archivos JAR

URLClassLoader carga clases desde una lista de URL (rutas de archivos o URL HTTP). Es útil para sistemas de complementos que añaden archivos JAR durante la ejecución.

URL[] urls = { new File("plugins/my-plugin.jar").toURI().toURL() };
try (URLClassLoader loader = new URLClassLoader(urls, getClass().getClassLoader())) {
    Class<?> cls = loader.loadClass("com.example.PluginImpl");
    Plugin plugin = (Plugin) cls.getDeclaredConstructor().newInstance();
    plugin.start();
}

Cierre de ClassLoader

Cierre siempre URLClassLoader cuando haya terminado de utilizarlo: mantiene abiertos los archivos JAR. Al cerrarlo, podrá eliminar o actualizar esos archivos JAR. Utilice try-with-resources.

Delegación primero al hijo (carga aislada)

Algunos contenedores (Tomcat, Spring Boot fat JAR) invierten la jerarquía: el cargador hijo lo intenta primero y recurre al padre solo si no encuentra la clase. Esto aísla las versiones de las bibliotecas entre aplicaciones web.

Fugas de ClassLoader

Un classloader solo se recopila mediante el GC cuando ninguna clase cargada por él es accesible. Los campos estáticos que contienen objetos de una clase cargada mantienen activo el cargador, una fuga habitual al volver a desplegar aplicaciones.

Comprobación rápida

¿Qué hace un ClassLoader antes de intentar cargar una clase por sí mismo?

Resumen

Jerarquía de tres niveles: Bootstrap → Platform → Application. La delegación primero al padre evita la duplicación de clases. Los cargadores personalizados sobrescriben findClass. Utilice URLClassLoader para los sistemas de complementos. Cierre los cargadores para evitar fugas.

Preguntas frecuentes

¿La lección «Jerarquía de ClassLoader y cargadores personalizados» es gratis?

Sí — el texto completo de «Jerarquía de ClassLoader y cargadores personalizados» 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 «Jerarquía de ClassLoader y cargadores personalizados»?

Comprenda los cargadores de clases de arranque, de plataforma y de aplicación, y escriba un ClassLoader personalizado. 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 2 de 4.

¿Cuánto tiempo toma la lección «Jerarquía de ClassLoader y cargadores personalizados»?

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