URLClassLoader是否使用延迟加载?

时间:2016-05-30 13:13:46

标签: java jar runtime urlclassloader

我正在使用URLClassLoader在运行时从服务器URL加载jar(假设:commons-collection.jar)。我加载了commons-httpclient.jarcommons-io.jaraddURL()。我的问题是:每当我为每个jar调用$_partnerMapper->fetchMany(array('partner_type_id'=>9),'partner_type_id ASC');时,或者只要我实例化其中一个jar(懒惰)中使用的类,就会下载这些jar?

1 个答案:

答案 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代码不容易理解......