¿Cómo creo un ClassLoader padre-último / hijo-primero en Java, o cómo anular una versión anterior de Xerces que ya estaba cargada en el CL padre?

Me gustaría crear un cargador de clase padre-último / hijo-primera clase, p. un cargador de clases que buscará primero las clases en el cargador de clases secundario, y solo luego delegará en su ClassLoader primario para buscar clases.

Aclaración

Ahora sé que para obtener una separación completa de ClassLoading necesito usar algo como un URLClassLoader que pasa nulo como padre, gracias aesta respuesta a mi pregunta anterior

Sin embargo, la pregunta actual viene a ayudarme a resolver este problema:

Mi código + tarros dependientes se están cargando en un sistema existente, usando un ClassLoader que establece el ClassLoader de ese Sistema como su padre (URLClassLoader)

Este sistema usa algunas bibliotecas de una versión no compatible con la que necesito (por ejemplo, una versión anterior de Xerces, que no me permite ejecutar mi código)

Mi código se ejecuta perfectamente bien si se ejecuta solo, pero falla si se ejecuta desde ese ClassLoader

Howerver Necesito acceso a muchas otras clases dentro del ClassLoader padre

Por lo tanto, quiero permitirme anular, el cargador de clases padre "jar" con el mío: si se encuentra una clase a la que llamo en el cargador de clases hijo (por ejemplo, proporcioné una versión más nueva de Xerces con mis propios jarros, en lugar de uno usuarios por el ClassLoader que cargó mi código y tarros.

Aquí está el código del sistema que carga mi código + Frascos (no puedo cambiar este)

File addOnFolder = new File("/addOns"); 
URL url = addOnFolder.toURL();         
URL[] urls = new URL[]{url};
ClassLoader parent = getClass().getClassLoader();
cl = URLClassLoader.newInstance(urls, parent);

Aquí está el código "my" (tomado completamente de la demostración del código Flying Sauser "Hello World"):

package flyingsaucerpdf;

import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer;

public class FirstDoc {

    public static void main(String[] args) 
            throws IOException, DocumentException {

        String f = new File("sample.xhtml").getAbsolutePath();
        System.out.println(f);
        //if(true) return;
        String inputFile = "sample.html";
        String url = new File(inputFile).toURI().toURL().toString();
        String outputFile = "firstdoc.pdf";
        OutputStream os = new FileOutputStream(outputFile);

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(os);

        os.close();
    }
}

Esto funciona de forma independiente (ejecutando main) pero falla con este error cuando se carga a través del CL primario:

org.w3c.dom.DOM Excepción: NAMESPACE_ERR: Se intenta crear o cambiar un objeto de manera incorrecta con respecto a los espacios de nombres.

probablemente porque el sistema padre usa Xerces de una versión anterior, y aunque proporciono el jar Xerces correcto en la carpeta / addOns, dado que sus clases ya fueron cargadas y usadas por el sistema padre, no permite que mi propio código uso mi propio tarro debido a la dirección de la delegación. Espero que esto aclare mi pregunta, y estoy seguro de que ya se ha hecho antes. (Tal vez no hago la pregunta correcta)

Respuestas a la pregunta(5)

Su respuesta a la pregunta