我正在使用URLClassLoader在运行时从服务器URL加载jar(假设:commons-collection.jar
)。我加载了commons-httpclient.jar
,commons-io.jar
和addURL()
。我的问题是:每当我为每个jar调用$_partnerMapper->fetchMany(array('partner_type_id'=>9),'partner_type_id ASC');
时,或者只要我实例化其中一个jar(懒惰)中使用的类,就会下载这些jar?
答案 0 :(得分:0)
据我所知,行为未指定,因此它将取决于您的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
代码不容易理解......