JVM之类加载器

负责加载class文件,class文件在文件开头有棒定的文件标示, 将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定

JVM之类加载器

echo %JAVA_HOME%

echo %PATH%

echo %CLASSPATH%

类加载器分为两种,一种是虚拟机自带的类加载器,另一种是自定义的类加载器。我们通常不会自定义类加载器,而是使用java自带的类加载器,但是在框架、服务器中,由于一些特殊的应用方式,会在java自定义类加载器的基础上再增加一些自定义类加载器

Jvm自带三种类加载器,分别是BootstrapClassLoader,ExtClassLoader,AppClassLoader。

启动类加载器

**根加载器BootstrapClassLoader(启动类加载器)**负责加载由系统属性sun.boot.class.path指定目录下的核心类库,也就是我们%JAVA_HOME%\jre\lib目录。它只加载java、javax、sun开头的类

我们都知道Obejct就是java包下的一个类,所以我们可以尝试看看Obejct的类加载器是什么

System.out.println(Object.class.getClassLoader());

//Output:
//null

执行上面的语句会发现返回结果为null,为什么是null,其实是因为我们的根类加载器的编写语言是C++,VM不能够也不允许程序员获取该类,所以返回值用null替代

拓展类加载器(ExtClassLoader)

扩展加载器ExtClassLoader,他的父加载器为根加载器,他从java.ext.dirs(加载<JAVA_HOME>/lib/ext目录中的类库)系统属性所指定的目录中加载类库。是用java编写的,继承java.lang.ClassLoader类。

该类的父加载器是启动类加载器,这里的父子关系并非java中的继承关系

系统类加载器(应用类加载器)

public class test {
    public static void main(String[] args) {
        System.out.println(test.class.getClassLoader());
    }
}

//Output:
//sun.misc.Launcher$AppClassLoader@dad5dc

系统类加载器AppClassLoader,也称为应用类加载器,它的父加载器是扩展加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类,继承java.lang.ClassLoader类。

上面例子中的test就是我们的自定义类,并放在我们的classpath路径下,我们可以看到这个类的类加载器返回的是AppClassLoader

自定义加载器

用户自定义加载器,java.lang.ClassLoader的子类,用户可以定制类的加载方式

上一篇:双亲委派模型


下一篇:《从JDK源码级别彻底剖析JVM类加载机制》