2016-05-30 28 views
2

Ich verwende URLClassLoader zum Laden von Gläsern zur Laufzeit von einer Server-URL (sagen wir mal: http://jarsToBeLoaded/jars/). Ich lade beispielsweise commons-collection.jar, commons-httpclient.jar und commons-io.jar. Meine Frage ist: Diese Gläser werden heruntergeladen, sobald ich für jedes Glas addURL() aufrufen oder sobald ich eine Klasse instanziiere, die in einem dieser Gläser (faul) verwendet wird?Verwendet URLClassLoader Lazy Loading?

Antwort

0

Von dem, was ich sagen kann, ist das Verhalten nicht angegeben, so hängt es von Ihrer JVM ab, wie die URLs behandelt werden. Ich habe den Code von Open JDK 8u40 durchgesehen. Für diese Implementierung gibt es kein Herunterladen von Jars, wenn addUrl() aufgerufen wird. Der Anruf wird, für die sun.misc.URLClassPath delegieren Sie die Implementierung here sehen: die Magie passieren wird mit Laden von Klassen aus dem Jar-Dateien All

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

wenn Sie versuchen, Ihre Klassen in diesen Gläsern zu laden, Ihre benutzerdefinierten Classloader verwenden, zum ersten Mal und java.net.URLClassLoader.findClass wird aufgerufen werden. Ich bin mir nicht sicher, ob die Jars tatsächlich heruntergeladen und zwischengespeichert werden oder ob die JVM immer mit Netzwerkstreams arbeiten wird - der URLClassPath Code ist nicht einfach zu folgen ...