¿El cargador de clases Java personalizado no se utiliza para cargar dependencias?

He estado intentando configurar un cargador de clases personalizado que intercepta clases para imprimir qué clases se están cargando en la aplicación. El cargador de clases se ve así

public class MyClassLoader extends ClassLoader {
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        System.out.println("Loading: " + name);
        return super.loadClass(name);
    }
}     

Simplemente escupe el nombre de todas las clases que carga. Sin embargo, cuando intento ejecutar algún código,

import org.python.util.PythonInterpreter;
public class Scripts {
    public String main(){

        PythonInterpreter p = new PythonInterpreter();
        p.exec("print 'Python ' + open('.gitignore').read()");

        return "Success! Nothing broke";
    }
}

vía

MyClassLoader bcl = new MyClassLoader();
Class c = bcl.loadClass("Scripts");

Method m = c.getMethod("main");
String result = (String) m.invoke(c.getConstructor().newInstance());

se imprime

Loading: Scripts
Loading: java.lang.Object
Loading: java.lang.String
Loading: org.python.util.PythonInterpreter
Python build/
.idea/*
*.iml
RESULT: Success! Nothing broke

Lo que parece bastante extraño.org.python.util.PythonInterpreter no es una clase simple, y depende de un montón de otras clases en elorg.python.util paquete. Esas clases se están cargando claramente, para elexec'El código de Python es capaz de hacer cosas y leer mi archivo. Por alguna razón, sin embargo, esas clases no están siendo cargadas por el cargador de clases que cargóPythonInterpreter.

¿Porqué es eso? Tenía la impresión de que el cargador de clases solía cargar una clase.C sería usado para cargar todas las otras clases requeridas porC, pero eso claramente no está sucediendo aquí. ¿Se equivoca esa suposición? Si es así, ¿cómo lo configuro de tal manera que todas las dependencias transitivas deC son cargados por mi cargador de clases?

EDITAR:

Algunos experimentos con el uso deURLClassLoader, que fue sugerido. Modifiqué la delegación enloadClass():

try{
    byte[] output = IOUtils.toByteArray(this.getResourceAsStream(name));
    return instrument(defineClass(name, output, 0, output.length));
}catch(Exception e){
    return instrument(super.loadClass(name));
}

así como la subclase de MyClassLoader, URLClassLoader en lugar de ClassLoader simple, capturando URLs a través de:

super(((URLClassLoader)ClassLoader.getSystemClassLoader()).getURLs());

Pero no parece ser lo correcto. En particular,getResourceAsStream() me está devolviendo nulos a todas las clases que solicito, incluso a las clases que no son del sistema como la de Jython lib.

Respuestas a la pregunta(5)

Su respuesta a la pregunta