每天一道面试题-探究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 

相关推荐