是否有可用于从 InputStream 加载类的 ClassLoader 实现?
我正在尝试将具有 InputStream 的 JAR 加载到新的 ClassLoader 中。
是否有可用于从 InputStream 加载类的 ClassLoader 实现?
我正在尝试将具有 InputStream 的 JAR 加载到新的 ClassLoader 中。
这不太可能,如果您尝试自己做,您会发现。您将无法InputStream
在请求类时随机访问以查找类,因此您必须将内容缓存在内存或文件系统中。
如果您缓存在磁盘上,只需使用URLClassLoader。
如果您在内存中缓存,则需要Map
使用JarInputStream创建某种类型,然后进行扩展ClassLoader
(覆盖适当的方法)。这种方法的缺点是不必要地将数据保存在 RAM 中。
我知道这并不是您关于 JAR/ 问题的真正答案InputStream
。但是以下可能是您尝试实现的目标的替代解决方案。这是一些将 URL 添加到类路径的代码。
您可以将 a 转换java.io.File
为URL
as
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();
}
}