1

考虑以下简单方法(尝试)加载特定名称的所有类,驻留在位于指定路径的 JAR 文件中,即

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;
}

如果路径中有超过 1 个 JAR,每个 JAR 至少有一个类与已加载的类具有相同的规范名称,例如org.whatever.MyClass,有没有办法在没有自定义类加载器的情况下加载所有org.whatever.MyClass类?

4

2 回答 2

1

没有类只加载一次,类的键是 Classloader+Fully Qualified Class Name。它将检查缓存和类加载器链,如果找到该类,它将不会尝试再次加载它。选择哪一个是特定于实现的。

于 2012-05-24T02:11:57.990 回答
1

标准类加载器在单个命名空间中加载类。如果您正在从不同版本的实现中寻找相同类的实例,那么您必须使用自定义类加载器。您的代码片段是自定义加载的示例。

您可以参考这里发表的详细文章。

于 2012-05-24T02:25:59.310 回答