gpt4 book ai didi

Java ClassLoader 和依赖解析

转载 作者:搜寻专家 更新时间:2023-10-31 19:50:07 25 4
gpt4 key购买 nike

有人可以澄清一下,ClassLoader 的作用不仅是加载单个类,还包括它的依赖项吗?如果是这样,整个过程到底需要什么?如果可能的话,我正在寻找实现细节。

例如,在某些时候,必须从某个地方(网络或文件系统位置)读取字节,并且必须根据类规范名称和文件系统位置来计算文件系统位置预知 JVM 可用的类路径——单个类加载器如何尝试在可能的多个类路径上定位文件?它从哪里获得这些信息?此外,在什么时候验证类文件字节并检查其依赖项的可用性?

越详细越好:)

最佳答案

类加载是一个非常复杂的主题。 ClassLoader 和 Java 安全模型密不可分。本质上,JVM 按需加载类。当存在类加载器的层次结构时,JVM 会尝试在链中尽可能远地解析类。简而言之,如果类在“引导”类加载器和应用程序定义的类加载器中定义,它将始终使用引导类加载器中的版本。

在类加载器(例如 URLClassLoader)中,搜索顺序是您指定的查找顺序。本质上,将从第一个条目到最后一个条目搜索您告诉它具有类的 URL 数组。

当您定义的类引用另一个类时,该类也会使用相同的算法解析。但这里有一个问题:它只解决它相对于它被发现的地方。让我们假设类 SomeCoolThing 在引导类加载器中,但依赖于应用程序定义的类加载器中的 SomeLameThing。该过程如下所示:

App-ClassLoader: resolveClass("SomeCoolThing")
parent->resolveClass("SomeCoolThing")

Boot-ClassLoader (the ultimate parent): resolveClass("SomeCoolThing")
SomeCoolThing needs SomeLameThing
resolveClass("SomeLameThing") // Can't find SomeLameThing!!!!

尽管 SomeLameThing 在您请求 SomeCoolThing 的类加载器中,但 SomeCoolThing 是在不同的类加载器中解析的。其他类加载器不知道子类加载器,并尝试自行解析它但失败了。

很久以前我有一本书非常深入地介绍了 Java 类加载器,我推荐它。这是Java Security by O'Reilly Media .在处理 ClassLoader 及其工作原理时,它将回答您不想知道但仍然需要知道的所有问题。

关于Java ClassLoader 和依赖解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com