InputStreamからクラスをロードするために使用できるClassLoader実装はありますか?
InputStreamを持つJARを新しいClassLoaderにロードしようとしています。
InputStreamからクラスをロードするために使用できるClassLoader実装はありますか?
InputStreamを持つJARを新しいClassLoaderにロードしようとしています。
自分でやろうとするとわかるように、これはありそうにありません。要求されたクラスを検索するためにランダムにアクセスすることはできないInputStream
ため、メモリまたはファイルシステムのいずれかにコンテンツをキャッシュする必要があります。
ディスクにキャッシュする場合は、URLClassLoaderを使用してください。
Map
メモリにキャッシュする場合は、JarInputStreamを使用して何らかのものを作成してから、拡張する必要がありClassLoader
ます(適切なメソッドをオーバーライドします)。このアプローチの欠点は、データを不必要にRAMに保持することです。
これは、JAR/に関するあなたの質問に対する答えではないことを私は知っていますInputStream
。しかし、以下はあなたが達成しようとしていることに対する代替の解決策かもしれません。クラスパスにURLを追加するコードを次に示します。
あなたはとして
に変換することができjava.io.File
ますURL
f.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();
}
}