IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Day354.再谈类的加载器 -JVM -> 正文阅读

[Java知识库]Day354.再谈类的加载器 -JVM

再谈类的加载器

一、概述

在这里插入图片描述


1、大厂面试题

在这里插入图片描述


2、类加载器的分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBlbYnhV-1628523125236)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808174357089.png)]


3、类加载器的必要性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZXPzlz2-1628523125237)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808174417721.png)]


4、命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMXP7umn-1628523125238)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808180319454.png)]


代码解释

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXAJhHbb-1628523125239)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808174441574.png)]


结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHAOKm2m-1628523125241)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808174449342.png)]


解释

rootDir后面的地址是我们使用javac User.class指令生成的class文件地址,然后loader1和loader2是两个用户自定义类加载器(如果自定义的不必理解),之后使用这两个用户自定义类加载器加载同一类型的User类,获得的Class对象不是同一个,可以通过Class对象调用getClassLoader()方法获取对应的类加载器了,最后通过系统类加载器获取的Class对象也是独特的,也可以通过该Class对象获取系统类加载器


5、类加载机制的基本特征

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fFbduNi2-1628523125242)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210808174513639.png)]


6、类加载器之间的关系

Launcher.java类

public class Launcher {
    ……
        public Launcher() {
        Launcher.ExtClassLoader var1;
        try {
            var1 = Launcher.ExtClassLoader.getExtClassLoader();
        } catch (IOException var10) {
            throw new InternalError("Could not create extension class loader", var10);
        }

        try {
            this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
        } catch (IOException var9) {
            throw new InternalError("Could not create application class loader", var9);
        }

        Thread.currentThread().setContextClassLoader(this.loader);

        ……

    }
}

二、复习:类的加载器分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clkMsBDw-1628523125244)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809205219820.png)]


父类加载器和子类加载器的关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DX57BQbC-1628523125245)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809205604881.png)]

正是由于子类加载器中包含着父类加载器的引用,所以可以通过子类加载器的方法获取对应的父类加载器


注意

启动类加载器过C/C++语言编写,而自定义类加载器都是由Java语言编写的,虽然扩展类加载器应用程序类加载器是被jdk开发人员使用java语言来编写的,但是也是由java语言编写的,所以也被称为自定义类加载器


1、引导类加载器

引导类加载器加载扩展类加载器应用程序类加载器
在这里插入图片描述


引导类加载器需要加载的jar包文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fydxRtmw-1628523125249)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809195416407.png)]


2、扩展类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4y5UyDf-1628523125250)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809195850468.png)]

无法通过扩展类加载器获得引导类加载器,因为引导类加载器是用C/C++语言编写的,所以获取的值是null


扩展类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44KzBm8S-1628523125252)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809195917626.png)]


3、系统类加载器

使用频率是最高的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-urlEFD6S-1628523125252)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809211211472.png)]


4、用户自定义类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuMON5e0-1628523125253)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200005477.png)]


三、测试不同的类的加载器

在这里插入图片描述
在这里插入图片描述

获取当前线程上下文的ClassLoader的结果就是系统类加载器,这个可以在Launcher.java中被代码证明,即:

this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
Thread.currentThread().setContextClassLoader(this.loader);

代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIwZiUQp-1628523125257)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200111596.png)]


结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSbGUTxW-1628523125259)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200129729.png)]


四、ClassLoader源码解析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lwNj0uFv-1628523125260)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200147260.png)]


1、ClassLoader的主要方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhMZYDt4-1628523125261)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809220201136.png)]

真正加载的其实是defineClass();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vg5Z8X6H-1628523125262)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200222906.png)]


2、loadClass()剖析

loadClass()方法是ClassLoader.java类中的主要方法

满足双亲委派机制的代码实现就在是loadClass()实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CtA0nnSR-1628523125263)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809215506102.png)]


分析

假设现在需要加载User类,我们自然也知道这需要使用系统类加载器加载,接下来来到系统类加载器的loadClass()方法中,假设系统类加载器没有加载User类,同步代码块的作用在上面注释中写的很清楚,然后直接获取User类的Class对象,如果c为null,将会判断系统类加载器的父类加载器是否为空,我们知道系统类加载器的父类加载器是扩展类加载器(在Launcher.java类中验证),那么parent不为null,之后进入if判断,将会调用扩展类加载器的loadClass()方法,此方法和上面的loadClasss()方法是一样的,接下来来到扩展类加载器的loadClass()方法中的判断就不在说了,因此扩展类加载器没有加载User类,所以c是null,然后parent是null(在Launcher.java中验证,通过扩展类加载器获取到的父类加载器就是null),将会执行c=findBootstrapClassOrNull(Name),这个就是判断引导类加载器是否加载了User类,如果没有加载该类就会尝试加载User类,也就是如下代码:

private Class findBootstrapClassOrNull(String name){
    if (!checkName(name)) return null;
    return findBootstrapClass(name);
}

其中checkName()方法不用管,在本例中那个不会执行,然后会执行findBottstrapClass(),如果加载成功返回对应的Class实例,否则返回null,由于引导类加载器不会加载User类,所以本次结果肯定是null了,那回到扩展类加载器的loadClass()方法中,继续看c = findBootstrapClassOrNull(name),那c就是null了,之后便会调用c = findClass(name);,这个将会调用URLClassLoader类中的重写findClass方法,这个方法就不带大家看了,不过该方法会返回一个null值,毕竟User类不是被扩展类加载器加载的,接下来回到系统类加载器的loadClass()方法中,继续看c = parent.loadClass(name, false),由于返回值c是null,然后便会调用c = findClass(name),系统类加载器正好可以加载User类,返回一个Class对象


3、SecureClassLoader与URLClassLoader

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7c1OytR-1628523125264)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809220830678.png)]

URLClassLoader把findClass()进行了重写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXAaG27t-1628523125265)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200406692.png)]


4、ExtClassLoader与AppClassLoader

在这里插入图片描述


5、Class.forName()与ClassLoader.loadClass()

前者

1、静态方法,Class.forName(),直接通过Class静态调用

2、主动调用,会调用加载类的初始化方法(static{}等…)


后者

2、实例方法,ClassLoader.getSystemClassLoader().loadClass(),通过获取到类加载器去实例调用

2、被动调用,不会去调用加载类的初始化方法(static{}等…)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1tgL6r0P-1628523125269)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200515420.png)]


五、双亲委派模型

1、定义与本质

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kb73BMFP-1628523125270)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809221739151.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRFJeZGN-1628523125272)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200619670.png)]


2、优势与劣势

在这里插入图片描述
在这里插入图片描述


3、破坏双亲委派机制

①破坏双亲委派机制1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ITW1mizf-1628523125278)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200736048.png)]

以上简单来说就是jdk1.2之前还没有引入双亲委派机制,所以jdk1.2之前就是破坏双亲委派机制的情况


②破坏双亲委派机制2

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7XHHqG5-1628523125282)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200813791.png)]

简单来说就是线程上下文类加载器让启动类加载器和系统类加载器直接联系起来了,中间的扩展类加载器被省略了,所以这破坏了双亲委派机制,其中线程上下文类加载器就是系统类加载器,这个证明在01-概述—>载器之间的关系中有解释;


③破坏双亲委派机制3

在这里插入图片描述


4、热替换的实现

在这里插入图片描述

每次调用方法之前都要加载字节码文件,然后创建对象,我们可以把字节码文件变成最新的,那么创建的对象肯定是最新的,所以这就完成了热替换


六、沙箱安全机制

隔离执行,在箱子里执行;限制程序运行环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRkA38il-1628523125287)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809230336472.png)]

1、JDK1.0时期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knFbcl7f-1628523125288)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809200936726.png)]


2、JDK1.1时期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyQhgC3L-1628523125290)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809201001705.png)]


3、JDK1.2时期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHbHN74r-1628523125291)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809201110674.png)]


4、JDK1.6时期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eW3hEF7P-1628523125292)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809201130985.png)]


七、自定义类的加载器

在这里插入图片描述


实现方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BapWtbLb-1628523125294)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210809231126720.png)]


八、Java9新特性

在这里插入图片描述

之前的URLClassLoader继承关系被改变,全都继承与BuiltinClassLoader
在这里插入图片描述


不同的模块,由不同的类的加载器加载

在这里插入图片描述


代码

public class ClassLoaderTest {
    public static void main(String[] args) {
        System.out.println(ClassLoaderTest.class.getClassLoader());
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent());
        System.out.println(ClassLoaderTest.class.getClassLoader().getParent().getParent());
        //获取系统类加载器
        System.out.println(ClassLoader.getSystemClassLoader());
        //获取平台类加载器
        System.out.println(ClassLoader.getPlatformClassLoader());
        //获取类的加载器的名称
        System.out.println(ClassLoaderTest.class.getClassLoader().getName());
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:17:12  更:2021-08-10 13:18:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:24:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码