运行结果:
上述实在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