【问题标题】:Does URLClassLoader use lazy loading?URLClassLoader 是否使用延迟加载?
【发布时间】:2016-05-30 13:13:45
【问题描述】:

我正在使用 URLClassLoader 在运行时从服务器 URL 加载 jars(比如说:http://jarsToBeLoaded/jars/)。例如,我加载commons-collection.jarcommons-httpclient.jarcommons-io.jar。我的问题是:只要我为每个 jar 调用 addURL() 或实例化在其中一个 jar 中使用的类(懒惰),就会下载这些 jar?

【问题讨论】:

    标签: java jar runtime urlclassloader


    【解决方案1】:

    据我所知,没有指定行为,因此它将取决于您的 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 代码不容易理解......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-30
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2014-01-19
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多