我是否可以使用ClassLoader实现从InputStream加载类?
我正在尝试将我有一个InputStream的JAR加载到一个新的ClassLoader中。
答案 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();
}
}