一、类加载过程
先说一下类的生命周期吧
加载、验证、准备、解析、初始化、使用、卸载
类的加载过程也发生在类的生命周期中,其实就是他的前五步:
1、加载
查找加载类的二进制数据(Class文件)
其中,在方法区中存放类的信息;在堆中存放Class文件对应的类实例
2、验证
确保加载的类信息是正确的
3、准备
为类的静态变量进行初始化,分配空间并赋予初始值
4、解析
是将符号引用转换为直接引用
5、初始化
JVM对类进行初始化,对静态变量赋予正确的值
面试中说清楚每一步是干嘛的基本上就行了。
二、类加载器
我们首先随便创建一个类,看一下当前类的类加载器是什么
@Test public void test(){ ClassLoader classLoader = this.getClass().getClassLoader(); System.out.println(classLoader); }
再看看他的上级
@Test public void test(){ ClassLoader classLoader = this.getClass().getClassLoader(); System.out.println(classLoader); System.out.println(classLoader.getParent()); }
再往上看:
System.out.println(classLoader.getParent().getParent());
显示为null,是没有了吗?并不是的。其实最高的加载器叫做BootStrapClassLoader,是用C语言写的,所以打印不出来。
那么我们就可以总结一下这些加载器了,由上到下:
1、 BootStrapClassLoader 加载的其实是所有类路径为 java.* 的类
2、ExtClassLoader 加载的其实是所有类路径为 javax.* 的类
3、AppClassLoader 加载用户自定义的类
4、用户自定义类加载器
参考:Java面试必知必会.Java虚拟机.02.类加载机制_哔哩哔哩_bilibili