有人可以澄清一下,类加载器的作用不仅是加载单个类,而且还加载其依赖项吗?如果是这样,整个过程到底需要什么?如果可能的话,我正在寻找实施细节。
例如,在某些时候,必须从某个地方(网络或文件系统位置)读取字节,并且必须根据类规范名称和类的预知来计算文件系统位置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 类加载器,我推荐它。它是O'Reilly Media 的 Java 安全性 http://oreilly.com/catalog/9781565924031。它将回答您在处理类加载器及其工作原理时不想知道但仍然需要知道的每一个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)