从JAR加载为InputStream?
是否有一个ClassLoader实现,我可以用来从InputStream加载类?
我正在尝试将具有InputStream的JAR加载到新的ClassLoader中。
这是不太可能的,因为你会发现如果你自己尝试这样做。 您将无法随机访问InputStream
以在请求时查找类,因此您必须将内容缓存在内存或文件系统中。
如果您在磁盘上缓存,只需使用URLClassLoader 。
如果在内存中缓存,则需要使用JarInputStream创建某种Map
,然后扩展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(); } }