我是否可以从输入流(例如,来自url连接)加载jar文件,将其加载到类加载器中并执行它? 谢谢你的时间。
答案 0 :(得分:3)
是; URLClassLoader
旨在实现此目的。它可以从一组URL加载类。
URL externalJar = new URL("http://example.com/app.jar");
URL localJar = new URL("C:/Documents/app.jar");
URLClassLoader cl = new URLClassLoader(URL[]{ externalJar, localJar });
Class<?> clazz = cl.loadClass("SomeClass"); // you now can load classes
如果InputStream
不是基于URL
,则可以将流的内容写入临时jar文件,然后使用上述方法加载该文件。 (你可以将jar完全加载到内存中,这意味着没有创建临时文件,但是这种方法需要付出相当多的努力,因为你需要定义一个自定义的ClassLoader。
答案 1 :(得分:1)
public static URL getJarUrl(final File file) throws IOException {
return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
}
这正确地获取了Lib的URL,因为Jar文件在尝试获取URL时会做一些不稳定的事情。