Carga dinámica de clases desde múltiples JAR

Considere el siguiente método simple que (intenta) cargar todas las clases de un nombre específico, que reside en un archivo JAR ubicado en una ruta especificada, es decir

public static List<Class<?>> getAllClasses(String name, String path)
{
    File file = new File(path);

    try
    {
        URL url = file.toURI().toURL();

        URLClassLoader loader = URLClassLoader.newInstance(new URL[] {url});

        JarFile jar = new JarFile(file);

        Enumeration<JarEntry> entries = jar.entries();

        Class<?> type;

        String elementName;

        List<Class<?>> classList = new ArrayList<Class<?>>();

        while (entries.hasMoreElements())
        {
            elementName = entries.nextElement().getName();

            if (elementName.equals(name))
            {
                try
                {
                    type = loader.loadClass(elementName);
                    classList.add(type);
                }
                catch (Exception e)
                {
                }
            }
        }

        return classList;
    }
    catch (Exception e)
    {
    }

    return null;
}

Si hay más de 1 JAR en la ruta, cada uno de los cuales tiene al menos una clase con un nombre canónico idéntico con una clase ya cargada, por ejemplo org.whatever.MyClass, ¿hay alguna forma, sin cargadores de clases personalizados, para cargar todas las org.whatever.MyClassclases?

Respuesta 1

Los cargadores de clases estándar cargan clases en un único espacio de nombres. Si está buscando instancias de una misma clase de implementaciones de versiones diferentes, entonces debe usar cargadores de clases personalizados. Su fragmento de código es un ejemplo para la carga personalizada.

Puede consultar un artículo detallado publicado aquí .

Respuesta: 2

Estoy usando el editor de diseño visual en Netbeans. Tengo dos controles deslizantes con JLabels correspondientes. Lo que quiero es un rectángulo que cambie de color cuando se mueve el control deslizante. ¿Cómo incorporo esto con ...

Tengo un servlet que llama a la base de datos MySQL. El método deletePage tiene este aspecto: public void deletePage (PageData delete) {String firstQuery = "Delete FROM pages Where ID = '" + delete.getId () + "' ...

Estoy migrando varias aplicaciones de JBoss 4 a GlassFish 3.1.x. Cada una de estas aplicaciones usa la misma API que proporciona clases e interfaces comunes que usa cada una de las aplicaciones. Vamos a ...

Tengo una GUI, que presenta una tabla con miles de filas y algunas columnas. Estoy tratando de iterar por filas a través de algunas coincidencias encontradas en la GUI cuando el cliente usa mi funcionalidad de búsqueda. Soy capaz ...