`

Java程序员从笨鸟到菜鸟之(九十七)深入java虚拟机(六)——类加载的父亲委托机制

阅读更多

在前面两篇博客中我们简单介绍了类加载器的基础和类的生命周期的基础内容,今天我们来继续深入的来看一下java的类加载器的详细内容。我们都知道。类加载器用来把类加载到 java 虚拟机。从 JDK2.0 开始,类的加载过程采用父亲委托机制。 JVM ClassLoader 采用的是树形结构,除了 根类加载器以外,每个ClassLoader 都会有 且仅有一个父类加载器,用户自定义的ClassLoader 默认的 父类加载器是系统类加载器,当然你可以自己指定需要用个ClassLoader 的实例,我们来看他 们的父子关系:




 

父类委托机制中,当一个java程序请求加载器 loader1 加载 Hello 类时, loader1 首先委托自己的父亲加载器加载 hello 类,若父亲加载器能加载,则由附加器完成加载人物,否则才由加载器 loader1 本身加载 Hello 类。下面我们来再次看一下 java 虚拟机自带的几个加载器:




除了java 虚拟机自带的加载器之外,我们用户自己也可以自定义自己的类加载器,根据自己的需要。。 Java 提供了抽象类 java.lang.ClassLoder ,所有用户自定义的类加载器都要继承这个 classloader 类。

 

注: 加载器之间的父子关系实际上指的是加载器对象之间的包装关系,而不是类之间的继承关系。一对父子加载器可能是同一个加载器类的两个实例,也可能不是。在子加载器对象中包装了一个父加载器对象. 当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器就将成为该类加载器的父加载器。 如果在构造方法中指定父类加载器那么父类加载器就是指定的加载器。证明如下:



 

ClassLoader loader1 = new MyClassLoader();
//参数loader1将作为loader2的父加载器
ClassLoader loader2 = new MyClassLoader(loader1);

 

 

 

 

Java 虚拟机要加载一个类时,到底该派哪个类加载器去加载呢 ?我们看下图:

 

 

Loader1 loader2 是我们自己定义的两个类加载器, loader1 loader2 是父子关系。现在我们想让 loader2 这个类加载器加载我们自己写的一个 Sample 类: loader2.loadclass (“ sample ”),我们来分析一下看看到底应该用哪一个类加载器去加载。当这段代码被执行时, loader2 首先到自己的命名空间去查找 Sample 类是否已经被加载,如果被加载就直接返回这个类的 class 对象的引用。如果 Sample 类还没有被加载, loader2 首先请求 loader1 代为加载, loader1 再请求系统类加载器代为加载,系统类加载器再请求扩展类加载器,扩展类加载器再请求根类加载器,若根类加载器和扩展类加载器都不能加载,则系统类加载器尝试加载,若能加载,则将 Sample 类所对应的 Class 对象的引用返回给 loader1 loader1 在将引用返回给 loader2 ,从而成功将 Sample 类加载到虚拟机。若系统类加载器不能加载 Sample 类,则 loader1 尝试加载 Sample 了哦,若 loader1 不能加载,则 loader2 尝试,若所有的类加载都不能加载,则抛出 ClassNotFoundException 异常。


 

定义类加载器 :如果某个类加载器能够加载一个类,那么该类加载器就称作:定义类加载器;定义类加载器及其所有子加载器都称作:初始类加载器

 

父委托机制的优点就是能够提高软件系统的安全性。因为在词机制下,用户自定义的类加载器不可能加载本应该由父加载器加载的可靠类,从而防止不可靠的恶意代码代替由父类加载器加载的可靠类,从而防止不可靠的甚至恶意的代码代替由父类加载器加载的可靠代码。如,java.lang.Object类总是由根类加载器加载的,其他任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类。


 

命名空间,其实这里所说的命名空间就是我们 java中常用的package,每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类的组成。在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个雷;在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类。


由同一类加载器加载的属于相同包的类组成了运行时包。决定两个类是不是属于同一个运行时包,不仅要看他们的包名称是否相同,还要看定义类加载器是否相同。只有属于同一运行时包的类之间才能相互访问可见(默认访问级别)的类和成员。假设用户自定义了一个类java.lang.TestCase并由用于自定义的类加载器加载,由于java.lang.TestCase和核心类库java.lang.*由不同的类加载器加载,他们属于不同的运行时包,所以java.lang.TestCase不能访问核心库java.lang包中的包可见成员。

 


参考资料:北京张龙老师免费培训视频《类加载器的父亲委托机制深度详解》


------------------------------------------------------------------------------------------------------------

《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

 

http://blog.csdn.net/csh624366188/article/details/7999247

 


 

 

分享到:
评论

相关推荐

    java程序员-从笨鸟到菜鸟.pdf

    java程序员-从笨鸟到菜鸟.pdf

    [网盘]java程序员由菜鸟到笨鸟.pdf

    ### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...

    JAVA程序员 从笨鸟到菜鸟.pdf

    曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...

    Java程序员由菜鸟到笨鸟学习文档

    Java程序员的成长之路是一个充满挑战与探索的过程,从初学者到熟练掌握各项技能,需要系统性的学习和实践。"Java程序员由菜鸟到笨鸟学习文档"就是这样一个旨在帮助初入Java世界的学习者逐步进阶的资源。它覆盖了从...

    java程序员从笨鸟到菜鸟

    ### Java程序员从笨鸟到菜鸟 #### 一、开发环境搭建与基本语法 ##### 开发环境搭建 在开始Java的学习之前,首先需要搭建一个合适的开发环境。这通常涉及到以下步骤: 1. **JDK(Java Development Kit)安装**:...

    《Java程序员-从笨鸟到菜鸟》PDF下载

    资源名称:《Java程序员-从笨鸟到菜鸟》PDF 下载资源目录:作者简介:..........................................................................................................................................

    java程序员由菜鸟到笨鸟

    《java程序员由菜鸟到笨鸟》 刚开始学习java时看过的一个学习资料。 其中包括开发环境搭建、面向对象、Javascript、设计模式、SSH、jquery、java虚拟机等内容。 设计内容较广,可以学习参考。

    [网盘]java程序员由菜鸟到笨鸟.pdf.2018_03_19

    以上内容只是《Java程序员由菜鸟到笨鸟》这本书中可能涵盖的部分知识点。对于初学者来说,系统地学习这些基础知识是非常重要的,因为它们构成了Java编程的基础,也是进一步学习高级主题的基石。希望这些内容能够帮助...

    [网盘]java程序员由菜鸟到笨鸟.pdf.2018_03_17

    根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月17日。以下是从该书的标题、描述以及部分可能包含的内容中提炼出的关键...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、...

    java游戏笨鸟

    《Java游戏:笨鸟》(也称为FlappyBird)是一款基于Java编程语言开发的简单游戏,旨在帮助初学者更好地理解和掌握Java编程基础。这款游戏的实现涉及了许多Java编程的关键概念和技术,下面将对这些知识点进行详细阐述...

Global site tag (gtag.js) - Google Analytics