每天一道面试题-探究JVM中-类的加载机制
类的加载机制是怎么样的?下面我们分几个部分来讲解
1,这些概念你知道是什么意思吗?
相信你应该听过不少这样的词语,
类加载机制,双亲委托机制,BootstrapClassLoader、ExtClassLoader、AppClassLoader
如果你不清楚,这些都是什么意思?没关系,看完下面的内容,你就清楚了
2,什么是类的加载机制?
所谓类的加载机制是指JVM将java类加载到内存的过程。
我们知道,JVM使用Java类的流程如下:
1,首先,Java源文件----编译---->class文件
2,其次,类加载器ClassLoader会读取这个.class文件,并将其转化为java.lang.Class的实例。有了该实例,JVM就可以使用他来创建对象,调用方法等操作了。
那么ClassLoader是以一种什么机制来加载Class的?
具体,分为下面两个方面来考虑
1,这些class文件的来源都有哪些?
2,谁来加载这些class
3,Class文件的来源都有哪些?
1,Java内部自带的核心类,位于$JAVA_HOME/jre/lib
2,Java的扩展类,位于$JAVA_HOME/jre/lib/ext目录下
3,我们自己开发的类或项目开发用到的第三方jar包,位于我们项目的目录下,比如WEB-INF/lib目录
4,谁来加载这些Class?
针对不同的来源,Java分了不同的ClassLoader来加载
1,Java核心类,这些是Java运行的基础类,由一个名为BootstrapClassLoader加载器负责加载。
这个类加载器被称为“根加载器或引导加载器”。
注意:BootstrapClassLoader不继承ClassLoader,是由JVM内部实现。
2,Java扩展类,是由ExtClassLoader负责加载,被称为“扩展类加载器”。
3,项目中编写的类,是由AppClassLoader来负责加载,被称为“系统类加载器”。
那么问题来了,String这个常用类,应该是由哪个类加载器来加载?
你可能会说,这还不简单,String属于核心类,所以由BootstrapClassLoader加载,但这个答案的前提是,我们知道String属于核心类,而作为JVM的加载机制,它是怎么去做到的?所以,我们推出了一个关键点:双亲委托机制
5,双亲委托机制
就是加载一个类,会先获取到一个系统类加载器AppClassLoader的实例,然后往上层层请求,先由BootstarpClassLoader去加载,如果BootStrapClassLoader发现没有,再下发给ExtClassLoader去加载,还是没有,才由AppClassLoader去加载。
总体来说,就是由上层类加载器优先加载,不存在,再由下层类加载器加载,这也是一种安全的考虑。
6,程序验证
案例1:创建一个自己的类,然后打印其类加载器
publicclass ClassLoaderTest {
publicstaticvoid main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("com.qianfeng.thread.client.Programmer");
ClassLoader classLoader = clazz.getClassLoader();
System.out.println(classLoader.getClass().getSimpleName());
}
}
案例2:打印其双亲类加载器信息
while(classLoader.getParent() != null){
classLoader = classLoader.getParent();
System.out.println("-->"+classLoader.getClass().getSimpleName());
}
--------------------- 本文来自 互联网十年老兵- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/happy_coding_life/article/details/80381245?utm_source=copy