从JAR加载为InputStream?

时间:2010-04-10 16:38:57

标签: java jar classloader inputstream

我是否可以使用ClassLoader实现从InputStream加载类?

我正在尝试将我有一个InputStream的JAR加载到一个新的ClassLoader中。

2 个答案:

答案 0 :(得分:6)

这是不太可能的,因为你会发现如果你自己尝试这样做。您将无法随机访问InputStream以查找所请求的类,因此您必须将内容缓存在内存或文件系统中。

如果您在磁盘上缓存,只需使用URLClassLoader

如果您在内存中缓存,则需要使用JarInputStream创建某种Map,然后扩展ClassLoader(覆盖相应的方法)。这种方法的缺点是你不必要地将数据保存在RAM中。

答案 1 :(得分:0)

我知道这不是你对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();
    }
}