2016-05-30 106 views
2

我正在使用URLClassLoader在運行時從服務器URL加載jar(例如:http://jarsToBeLoaded/jars/)。例如,我加載了commons-collection.jar,commons-httpclient.jarcommons-io.jar。我的問題是:只要我爲每個jar調用addURL(),或者在實例化一個在這些jar(懶惰)中使用的類時,就立即下載這些jar文件?URLClassLoader是否使用延遲加載?

回答

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代碼不容易遵循...