了解Java中的类加载器

    类加载器(ClassLoader)在Java中是负责把一个类加载到JVM中(通过寻找到类的字节码文件并构造出类在JVM中表示对象的组件)。ClassLoader实现该过程的步骤:

(1)装载:查找和导入Class文件

(2)链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的。~1.校验:检查载入class文件数据的正确性~2.准备:给类的静态变量分配存储空间~3.解析:将符号引用转换成直接引用

(3)初始化:对类的静态变量、静态代码块执行初始化工作

JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader(扩展类装载器),AppClassLoader(应用类装载器)。其中,根装载器不是ClassLoader的子类,它是使用C++编写的,它主要负责装载JRE中的核心类库。ExtClassLoader和AppClassLoader是ClassLoader的子类,ExtClassLoader负责负责装载JRE扩展目录ext类中的jar类包,AppClassLoader负责装载Classpath路径下的类包。这三个类装载器之间存在着父子关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。在默认情况下,使用AppClassLoader装载应用程序的类。

虚拟机在进行装载类的时候,采用的是“全盘负责委托机制”,全盘负责是指当一个ClassLoader装载一个类时,除非显式的使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;委托机制是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。采用这一机制,避免了恶意编写的基础类装载到JVM中。

在Java中,ClassLoader是一个抽象类,位于java.lang包下,相关方法查询api文档。

除了JVM默认的三个ClassLoader外,用户可以自定义第三方的类加载器来满足一些特殊的要求。

每个类在JVM中都拥有一个对应的java.lang.Class 对象,它提供了类结构信息的描述。数组,枚举,注解及基本java类型,甚至void都拥有对应的class对象。Class没有public的构造方法。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。

了解Java中的类加载器_第1张图片
图片发自App

你可能感兴趣的:(了解Java中的类加载器)