我正在使用URLClassLoader在運行時從服務器URL加載jar(例如:http://jarsToBeLoaded/jars/
)。例如,我加載了commons-collection.jar
,commons-httpclient.jar
和commons-io.jar
。我的問題是:只要我爲每個jar調用addURL()
,或者在實例化一個在這些jar(懶惰)中使用的類時,就立即下載這些jar文件?URLClassLoader是否使用延遲加載?
2
A
回答
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文件加載類的魔法會發生,第一次和java.net.URLClassLoader.findClass
將被調用。我不確定是否實際上將Jars下載並緩存到某處,或者JVM將始終與網絡流一起工作 - URLClassPath
代碼不容易遵循...