24_平台特定的启动类加载器深入分析与自定义系统类加载器详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43277087/article/details/102750664

在这里插入图片描述
运行结果:
在这里插入图片描述
上述实在Java程序中运行的结果。
若是在控制台上通过命令运行
在这里插入图片描述
在这里插入图片描述
系统会根据你运行的目录的不同,生成相应的目录
通过上截图,可以看出,应用类加载器的加载目录为.也就是当前目录
下图就是.(点)目录
在这里插入图片描述
总结:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
若是将
在这里插入图片描述
根加载器加载目录修改下
改成当前目录
在这里插入图片描述
虚拟机初始化的时候出错,先加载Object类
找不到object类,虚拟机就启动不起来
在这里插入图片描述
疑问:类加载器将类加载到虚拟机
但是,类加载器本身就是Java类,它自己怎么加载到虚拟机的呢?
它是由启动类加载器加载的

根加载器是由C++写的,内嵌于Java虚拟机中,它是归属于jvm的一部分
而应用类加载器和扩展类加载器都是由启动类加载器负责的

在这里插入图片描述
验证扩展类加载器和启动类加载器由谁加载?
在这里插入图片描述
在这里插入图片描述
它们都是Launcher类的静态内部类,外部并不能直接访问
那么,我们就先加载Launcher类,加载它的加载器为A,当加载Launcher类时,A加载器会加载Launcher类内部的所有Launcher类依赖的类。

在这里插入图片描述
在这里插入图片描述
说明Launcher类由启动类加载器加载的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
系统类加载器:
在这里插入图片描述
在这里插入图片描述
系统属性:java.system.class.loader默认为APPClassLoader
上图中,说明我们可以自定义系统属性:java.system.class.loader作为系统类加载器,取代原来的APPClassLoader

查看java.system.class.loader的默认值:
在这里插入图片描述
在这里插入图片描述
说明这个属性,默认是未定义的
没有被定义,那么系统类加载器默认指向APPClassLoader

使用MyTest16作为系统类加载器加载MyTest23
在这里插入图片描述
在这里插入图片描述
文档中说明:
这个新的系统类加载器必须有个public构造方法,传入类加载器作为它的委托双亲
在这里插入图片描述
再次执行此命令
在这里插入图片描述
说明MyTest16作为系统类加载器成功

但是
在这里插入图片描述
在Idea中运行此上图程序:
在这里插入图片描述
当在控制台上执行:
在这里插入图片描述
为什么呢?
使用Idea运行,系统类加载器的那个属性没有被赋值,还是原来的规则,没变,所以是APPClassLoader

而在控制台上使用命令
将系统类加载器的那个属性改变了
所以输出的系统类加载器为自定义加载器,但是,此加载器的父加载器是APPClassLoader

猜你喜欢

转载自blog.csdn.net/qq_43277087/article/details/102750664