8

InputStreamからクラスをロードするために使用できるClassLoader実装はありますか?

InputStreamを持つJARを新しいClassLoaderにロードしようとしています。

4

2 に答える 2

6

自分でやろうとするとわかるように、これはありそうにありません。要求されたクラスを検索するためにランダムにアクセスすることはできないInputStreamため、メモリまたはファイルシステムのいずれかにコンテンツをキャッシュする必要があります。

ディスクにキャッシュする場合は、URLClassLoaderを使用してください。

Mapメモリにキャッシュする場合は、JarInputStreamを使用して何らかのものを作成してから、拡張する必要がありClassLoaderます(適切なメソッドをオーバーライドします)。このアプローチの欠点は、データを不必要にRAMに保持することです。

于 2010-04-10T16:55:56.787 に答える
0

これは、JAR/に関するあなたの質問に対する答えではないことを私は知っていますInputStream。しかし、以下はあなたが達成しようとしていることに対する代替の解決策かもしれません。クラスパスにURLを追加するコードを次に示します。

あなたはとして に変換することができjava.io.FileますURLf.toURI().toURL()

/**
 * Adds a URL to current classpath.
 * @param url url
 */
public static void addURL(URL u) {      
    URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader();
    try {
        Method method = URLClassLoader.class.getDeclaredMethod("addURL",parameters);
        method.setAccessible(true);
        method.invoke(sysloader,new Object[]{u});
        System.out.println("Dynamically added " + u.toString() + " to classLoader");
    } 
    catch (Exception e) {
        e.printStackTrace();
    }
}
于 2010-04-10T17:35:12.810 に答える