2016-05-30 8 views
2

URLClassLoaderを使用して、実行時にサーバーのURLからjarをロードしています(例:http://jarsToBeLoaded/jars/)。例えば、commons-collection.jar,commons-httpclient.jarおよびcommons-io.jarをロードする。私の質問は、これらのjarファイルは、それぞれのjarファイルに対してaddURL()を呼び出すとすぐにダウンロードされます。あるいは、それらのjarファイル(lazy)の中で使用されているクラスをインスタンス化するとすぐにダウンロードできますか?URLClassLoaderは遅延読み込みを使用しますか?

答えて

0

私が知ることから、動作は指定されていないので、URLがどのように扱われるかはJVMに依存します。私はOpen JDK 8u40のコードを見てきました。この実装では、addUrl()が呼び出されたときにJarsのダウンロードはありません。呼び出しは、あなたが実装here見ることができるためsun.misc.URLClassPathに委任されて:あなたはあなたのカスタムクラスローダを使用して、これらのjarファイルにあなたのクラスをロードしようとすると、あなたのJarファイルからクラスをロードすると全ての魔法が起こるのだろう

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(); 
     } 
    } 
} 

を、最初はjava.net.URLClassLoader.findClassと呼ばれます。 Jarsが実際にダウンロードされ、どこかにキャッシュされているのか、JVMが常にネットワークストリームで動作するのかわかりません - URLClassPathコードは従うのが簡単ではありません...

関連する問題