VLo*_*Boy 5 java architecture classloader
有人可以澄清一下,ClassLoader的作用不仅仅是加载一个单独的类,还加载它的依赖关系?如果是这样,整个过程到底需要什么?如果可能的话,我正在寻找实施细节.
例如,在某些时候,字节将不得不从某处读取(网络或文件系统位置),以及文件系统中的位置将必须被一个类规范名称的基础和类的预知计算JVM可用的路径 - 单个ClassLoader如何尝试在可能多个类路径上定位文件?它从哪里获取此信息?此外,在什么时候验证了类文件字节并检查其依赖性是否可用?
尽可能多的细节将不胜感激:)
ClassLoading是一个非常复杂的主题.ClassLoader和Java安全模型密不可分.本质上,JVM按需加载类.当存在类加载器的层次结构时,JVM会尝试尽可能地解析链中的类.简而言之,如果类在"boot"类加载器和应用程序定义的类加载器中定义,它将始终使用引导类加载器中的版本.
在类加载器中,例如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!!!!
Run Code Online (Sandbox Code Playgroud)
尽管SomeLameThing位于您请求SomeCoolThing的类加载器中,但SomeCoolThing已在另一个类加载器中解析.其他类加载器不了解子类加载器,并尝试自行解决它并失败.
很久以前我有一本书,它涵盖了Java ClassLoaders非常好的深度,我推荐它.它是O'Reilly Media的Java Security.它将回答您从未想知道的每个问题,但在处理ClassLoaders及其工作方式时仍需要.