【问题标题】:Does URLClassLoader use lazy loading?URLClassLoader 是否使用延迟加载?
【发布时间】:2016-05-30 13:13:45
【问题描述】:
我正在使用 URLClassLoader 在运行时从服务器 URL 加载 jars(比如说:http://jarsToBeLoaded/jars/)。例如,我加载commons-collection.jar、commons-httpclient.jar 和commons-io.jar。我的问题是:只要我为每个 jar 调用 addURL() 或实例化在其中一个 jar 中使用的类(懒惰),就会下载这些 jar?
【问题讨论】:
标签:
java
jar
runtime
urlclassloader
【解决方案1】:
据我所知,没有指定行为,因此它将取决于您的 JVM 如何处理 URL。我查看了 Open JDK 8u40 的代码。对于该实现,在调用 addUrl() 时不会下载 Jars。调用被委托给sun.misc.URLClassPath,你可以看到here的实现:
public synchronized void addURL(URL url) {
if (closed)
return;
synchronized (urls) {
if (url == null || path.contains(url))
return;
urls.add(0, url);
path.add(url);
if (lookupCacheURLs != null) {
// The lookup cache is no longer valid, since getLookupCache()
// does not consider the newly added url.
disableAllLookupCaches();
}
}
}
当您第一次尝试使用您的自定义类加载器在这些 jar 中加载您的类时,所有从您的 Jar 文件加载类的魔法都会发生,java.net.URLClassLoader.findClass 将被调用。我不确定 Jars 是否真的会被下载并缓存在某处,或者 JVM 是否会一直使用网络流 - URLClassPath 代码不容易理解......