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 添加到类路径的代码。

您可以将 a 转换java.io.FileURLas 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();
    }
}
于 2010-04-10T17:35:12.810 回答