Java面试必问:类加载过程与类加载器

123 阅读1分钟

一、类加载过程

先说一下类的生命周期吧

加载、验证、准备、解析、初始化、使用、卸载

类的加载过程也发生在类的生命周期中,其实就是他的前五步:

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、用户自定义类加载器