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

パスに複数の JAR があり、それぞれがすでにロードされているクラスと同一の正規名を持つクラスを少なくとも 1 つ持つ場合、たとえばorg.whatever.MyClass、カスタマイズされたクラスローダーなしですべてのorg.whatever.MyClassクラスをロードする方法はありますか?

4

2 に答える 2

1

標準のクラスローダーは、単一の名前空間でクラスをロードします。異なるバージョンの実装から同じクラスのインスタンスを探している場合は、カスタムクラスローダーを使用する必要があります。コードスニペットは、カスタムロードの例です。

ここで公開されている詳細な記事を参照できます。

于 2012-05-24T02:25:59.310 に答える
1

一度だけロードされるクラスはなく、クラスのキーは Classloader+Fully Qualified Class Name です。キャッシュとクラスローダ チェーンをチェックし、クラスが見つかった場合は再度ロードを試みません。どちらが選択されるかは実装固有です。

于 2012-05-24T02:11:57.990 に答える